// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {goo: undefined}; foo.bar; // 1 'bar' in foo; // true foo.hasOwnProperty('bar'); // false foo.hasOwnProperty('goo'); // true
ここでは、hasOwnProperty だけが正しい答えを与えることができます。これは、オブジェクトのプロパティをトラバースするときに非常に必要です。 Javascript では、プロパティがオブジェクト自体に定義されているか、プロトタイプ チェーンから継承されているかを判断する他の方法はありません。
プロパティとして OwnProperty があります
JavaScript は hasOwnProperty を機密用語にしません。つまり、hasOwnProperty という名前のプロパティを持つことができます。この時点では、独自の hasOwnProperty メソッドを使用してプロパティを判断することはできなくなりました。そのため、外部の hasOwnProperty メソッドを使用して判断する必要があります。
var foo = { hasOwnProperty: function() { return false; }, bar: 'Here be dragons' }; foo.hasOwnProperty('bar'); // always returns false // Use another Object's hasOwnProperty and call it with 'this' set to foo ({}).hasOwnProperty.call(foo, 'bar'); // true // It's also possible to use hasOwnProperty from the Object // prototype for this purpose Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
概要
オブジェクトのプロパティの存在を判断する場合、信頼できるメソッドは hasOwnProperty のみです。また、for in ループを使用してオブジェクトを走査する場合、hasOwnProperty を使用すると、プロトタイプ オブジェクトの拡張によって引き起こされる問題を効果的に回避できることにも注意してください。