このような問題を解決する最も簡単な方法は、仕様のアルゴリズムに従うことです。これが私たちに伝えていることですpropertyIsEnumerable
:
descを、引数としてPを渡してOの [[GetOwnProperty]] 内部メソッドを呼び出した結果とします。
desc が定義されていない場合は、false を返します。
desc .[[Enumerable]]の値を返します。
ご覧のとおり、問題のオブジェクトの[[GetOwnProperty]]
内部メソッドが呼び出されます。これは、指定されたプロパティの値をオブジェクト自体から返すだけです(プロトタイプ チェーン内のものからではありません)。
in
それでは、演算子を見てみましょう:
[[HasProperty]] rval の内部メソッドを引数 ToString(lval) で呼び出した結果を返します。
そして、[[HasProperty]]
内部メソッドを見ると:
プロパティ名PでOの [[GetProperty]] 内部メソッドを呼び出した結果を desc とする
そして、ここで違いを見ることができます。このin
演算子[[GetProperty]]
は、メソッドの代わりに [ internal method][4] を使用[[GetOwnProperty]]
することになります。これは、プロトタイプ チェーンの下にあるオブジェクトのプロパティを見つけることを意味します。
その他の大きな違いは、(メソッドを使用して) オブジェクトに列挙不可能なプロパティを定義できることですObject.defineProperty
。列挙不可能なプロパティを定義すると、演算子によって返されますが、メソッドによって返されることはin
ありませんpropertyIsEnumerable
。違いを示すフィドルを次に示します。