2012-02-09 2 views
6

したがって空のオブジェクトa = {}があります。私はconsole.log(a)console.dir(a)、あるいはオブジェクトのすべての隠しプロパティを印刷する

for(b in a) { 
    console.log(b); 
} 

を行うと私はそのような__defineGetter__hasOwnPropertyとして「隠されたプロパティ」を見ることはありません、など

どのように私は、オブジェクトのすべてのプロパティを印刷することができます?

+0

だから、あなたがそれらを得ることができますか? Google Chromeではオブジェクトのすべてのプロパティを表示します – antyrat

+0

@antyrat私はGoogle Chrome 17を使用していますが、 'console.log'を使って見る唯一のプロパティは' __proto__'です。 – Randomblue

+0

このプロパティを開くことができ、その中に列挙できないすべてのプロパティが表示されます – antyrat

答えて

12

オブジェクトのプロパティ(おそらくはそのプロトタイプから継承したもの)は、non-enumerableのプロパティです。私は、JavaScriptを介してそれらを取得するための標準的な方法があるとは思わない。

デバッガを使用してオブジェクトを検査する場合、通常、オブジェクトのすべてのプロパティが表示されます(列挙可能なものだけでなく)。主要なブラウザには、現在、デバッガが組み込まれています:ChromeにはDev Tools(Ctrl + Shift + I)があります。 IE8以降には「F12開発ツール」があります。 IE7以前はVS.Netの無料版でデバッグできます。最近のバージョンのFirefoxにはツールが組み込まれていますが、古いバージョンではFirebugプラグインを入手できます。 OperaにはDragonflyがあります。

更新:あなたが言った質問のコメントの中で:私はGoogle Chromeの17と私はconsole.logの使用を参照してくださいプロパティのみを使用してい

__proto__です。

右。 {}には全くプロパティがありません。プロトタイプのみです。 __proto__の左にある小さな矢印をクリックすると、__proto__のプロパティが表示されます。 hasOwnProperty,toStringなどはすべてオブジェクトのプロパティではなく、{}がプロトタイプ(Object.prototype)から取得されます。

JavaScriptは、オブジェクトがプロトタイプによってバックアップされることを意味原型継承を使用します。オブジェクトが持っていないプロパティの値を取得しようとすると、JavaScriptエンジンはオブジェクトのプロトタイプを見て、プロトタイプにそのプロパティがあるかどうかを調べます。そうであれば、その値が使用されます。プロトタイプにそれがない場合、エンジンはプロトタイプのプロトタイプを調べます。それが階層のルートに達するまで続きます。このため、自身のプロパティとプロパティを継承しているオブジェクトについて聞くのはこのためです。ここで

は例です:ここでは

は、コンストラクタ関数です。 new Fooを使用してオブジェクトを作成すると、JavaScriptエンジンが割り当てるプロトタイプにプロパティを配置します。

function Foo() { 
} 
Foo.prototype.bar = 42; 

のは、そのコンストラクタを使用してオブジェクトを作成してみましょう:

var f = new Foo(); 

fには全く性質、まだ持っていない:

console.log(f.bar); // 42 

を...fには "bar"というプロパティがありませんので、エンジンはのプロトタイプを参照します。これはFoo.prototypeオブジェクトです。今のfの「バー "プロパティを削除しましょう

f.bar = 67; 
console.log(f.bar); // 67 

:今

のはfを与える独自の "バー" プロパティを聞かせて

delete f.bar; 
我々が取得しようとした場合どうなりますか

f.bar今?

console.log(f.bar); 

42と言った場合は、トップマークが付けられます。 fは "bar"というプロパティをもはや持っていないので、プロトタイプから取得することに戻ります。

ので、この関係はライブであることに注意してください、:のECMAScriptの第3版で

Foo.prototype.bar = 96; 
console.log(f.bar); // 96 

(ほとんどのブラウザは、第3版の線に沿って何かを実装する)、にプロトタイプを割り当てるための唯一の方法オブジェクトは上記のようにコンストラクタ関数のprototypeプロパティを経由しています。第5版では、より直接的な方法が追加されました:Object.create、あなたが直接にプロトタイプオブジェクトを渡すことができた。

var proto = {bar: 42}; 
var obj = Object.create(proto); 
console.log(obj.bar); // 42 
proto.bar = 67; 
console.log(obj.bar); // 67 
+0

でコンストラクタの詳細を読むことができます。非常によく書かれた(+1)、ありがとう:) – nkm

3

Object.getOwnPropertyNames(OBJ)も、それが、すべての非可算プロパティが表示されますprototype chainルックアップに従わず、.と表示されません。

プロトタイプチェーンを上っていて、列挙できないものが表示される方法はわかりません。

例:

var o = Object.create({base:0}) 
Object.defineProperty(o, 'yes', {enumerable: true}) 
Object.defineProperty(o, 'not', {enumerable: false}) 

console.log(Object.getOwnPropertyNames(o)) 
// [ 'yes', 'not' ] 

console.log(Object.keys(o)) 
// [ 'not' ] 

for (var x in o) 
    console.log(x) 
// yes, base 

だから我々は結論:

  • Object.keys()は、チェーンを行かない、と
  • for inは、チェーンまで行くが、表示されません非enumerablesは表示されません。非列挙型

もちろん手動でプロトタイプチェーンを登り、Object.getOwnPropertyNamesを使用してください。 Object__defineGetter__hasOwnPropertyの場合には

は、プロトタイプチェーンルックアップを介してnew Objectオブジェクト上に見出さObject.prototypeの特性です。

console.log(Object.getOwnPropertyNames(Object.prototype)) 

出力::あなたはどのようなブラウザを使用しました

[ 'constructor', 
    'toString', 
    'toLocaleString', 
    'valueOf', 
    'hasOwnProperty', 
    'isPrototypeOf', 
    'propertyIsEnumerable', 
    '__defineGetter__', 
    '__lookupGetter__', 
    '__defineSetter__', 
    '__lookupSetter__' ] 
関連する問題