為了判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性,
我們需要使用繼承自 Object.prototype 的 hasOwnProperty 方法。
注意: 通過判斷一個屬性是否
undefined是不夠的。 因為一個屬性可能確實存在,只不過它的值被設(shè)置為undefined。
hasOwnProperty 是 JavaScript 中唯一一個處理屬性但是不查找原型鏈的函數(shù)。
// 修改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 可以給出正確和期望的結(jié)果,這在遍歷對象的屬性時會很有用。
沒有其它方法可以用來排除原型鏈上的屬性,而不是定義在對象自身上的屬性。
JavaScript 不會保護 hasOwnProperty 被非法占用,因此如果一個對象碰巧存在這個屬性,
就需要使用外部的 hasOwnProperty 函數(shù)來獲取正確的結(jié)果。
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 總是返回 false
// 使用其它對象的 hasOwnProperty,并將其上下文設(shè)置為foo
({}).hasOwnProperty.call(foo, 'bar'); // true
當(dāng)檢查對象上某個屬性是否存在時,hasOwnProperty 是唯一可用的方法。
同時在使用 for in loop 遍歷對象時,推薦總是使用 hasOwnProperty 方法,
這將會避免原型對象擴展帶來的干擾。