0

私は次のことについて疑問に思っています。このコードを与える:

function displayprops(obj, name) {
    console.log(name+":");
    for(var prop in obj)
        console.log(prop + ": " + obj[prop]);
}

var first = {prop: {}};
displayprops(first, "first"); // "prop: [object Object]"

var second = Object.create(first);
Object.defineProperty(second,"prop",{
     enumerable:false
});
displayprops(second, "second"); // "prop: undefined"

jsbinでのデモ

から作成されたすべてのオブジェクトは、first明らかに propプロパティを継承する必要があります。

secondしかし、から作成されたオブジェクトが反復処理されたときに、プロパティにが表示されるのはなぜですか。propその値は。であることに注意してくださいundefined

列挙可能な記述子をfalseに設定すると、このプロトタイプから継承するオブジェクトは、これらのプロパティを表示されなくなるはずです。

編集:Object.prototypeを(何らかの理由で)メソッドで拡張し、メソッドの列挙可能な記述子をfalseに設定すると、期待どおりに動作します

誰かがこれを説明できますか、多分間違った方向に考えています

答えのThx=)

4

1 に答える 1

2

これはV8JavaScriptエンジンのバグです。私は前にそれに出くわしたことがあります。プロトタイプチェーンの列挙可能なプロパティは、列挙不可能なプロパティによってシャドウされている場合でも含まれます。

すでにバグレポートがあります。もう一度見つけたら、ここに投稿します。ここにあります...

問題705:列挙不可能なプロパティがfor-inから継承された列挙可能なプロパティをシャドウイングできない

Firefoxでテストすると、期待どおりの結果が得られます。

于 2012-07-27T14:18:03.800 に答える