私の理解が正しければ、JavaScript のすべてのオブジェクトは Object プロトタイプを継承します。つまり、JavaScript のすべてのオブジェクトは、そのプロトタイプ チェーンを通じて hasOwnProperty 関数にアクセスできます。
読んでいる間JS が必要' ソースコードを調べていたところ、この関数を見つけました:
function hasProp(obj, prop) {
return hasOwn.call(obj, prop);
}
hasOwn
は への参照ですObject.prototype.hasOwnProperty
。この関数を次のように記述した場合、実際上何か違いがありますか?
function hasProp(obj, prop) {
return obj.hasOwnProperty(prop);
}
ところで、なぜこの関数を定義するのでしょうか? これは、(わずかな)パフォーマンス向上のためのショートカットとプロパティ アクセスのローカル キャッシュの問題なのでしょうか、それとも、このメソッドを持たないオブジェクトで hasOwnProperty が使用される可能性があるケースを見逃しているのでしょうか?
ベストアンサー1
[私の例の間に]実際的な違いはありますか?
ユーザーは で作成された JavaScript オブジェクトを持っている可能性があります。このオブジェクトにはチェーンObject.create(null)
があるためnull
[[Prototype]]
、 は使用できませんhasOwnProperty()
。このため、2 番目のフォームを使用すると機能しません。
これは、より安全な参照でもありますObject.prototype.hasOwnProperty()
(また、より短いです)。
誰かがやったかもしれないことは想像できます...
var someObject = {
hasOwnProperty: function(lol) {
return true;
}
};
2 番目の例のように実装されていた場合は失敗しますhasProp(someObject)
( に委任されるのではなく、オブジェクト上でそのメソッドを直接見つけて呼び出しますObject.prototype.hasOwnProperty
)。
しかし、誰かが参照を上書きする可能性は低くなりますObject.prototype.hasOwnProperty
。
ところで、そもそもなぜこの関数を定義するのでしょうか?
上記を参照。
これは、(わずかな)パフォーマンス向上のための、プロパティ アクセスのショートカットとローカル キャッシュの問題だけでしょうか...
それはできるかもしれないより速く理論的には、[[Prototype]]
チェーンに従う必要はないが、これは無視できるほど小さいと思われる。ない実装の理由は、それがなぜなのかということです。
hasOwnProperty
... または、このメソッドを持たないオブジェクトで使用される可能性があるケースを見逃していますか?
hasOwnProperty()
に存在しますObject.prototype
が、オーバーライドすることができます。すべてのネイティブJavaScriptオブジェクト(ただしホストオブジェクトはこれに従うとは限りません)RobGの詳細な説明を見る) はObject.prototype
、チェーン上の最後のオブジェクトとして存在しますnull
(もちろん、 によって返されるオブジェクトは除きますObject.create(null)
)。