したがって空のオブジェクトa = {}
があります。私はconsole.log(a)
、console.dir(a)
、あるいはオブジェクトのすべての隠しプロパティを印刷する
for(b in a) {
console.log(b);
}
を行うと私はそのような__defineGetter__
、hasOwnProperty
として「隠されたプロパティ」を見ることはありません、など
どのように私は、オブジェクトのすべてのプロパティを印刷することができます?
したがって空のオブジェクトa = {}
があります。私はconsole.log(a)
、console.dir(a)
、あるいはオブジェクトのすべての隠しプロパティを印刷する
for(b in a) {
console.log(b);
}
を行うと私はそのような__defineGetter__
、hasOwnProperty
として「隠されたプロパティ」を見ることはありません、など
どのように私は、オブジェクトのすべてのプロパティを印刷することができます?
オブジェクトのプロパティ(おそらくはそのプロトタイプから継承したもの)は、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
でコンストラクタの詳細を読むことができます。非常によく書かれた(+1)、ありがとう:) – nkm
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__' ]
だから、あなたがそれらを得ることができますか? Google Chromeではオブジェクトのすべてのプロパティを表示します – antyrat
@antyrat私はGoogle Chrome 17を使用していますが、 'console.log'を使って見る唯一のプロパティは' __proto__'です。 – Randomblue
このプロパティを開くことができ、その中に列挙できないすべてのプロパティが表示されます – antyrat