通俗来说:hasOwnProperty用来判断一个属性是对象本身具有,还是原型链上所有,true就是本身所有
为了判断一个对象是否包含自定义属性而不是原型链上的属性, 我们需要使用继承自Object.prototype
的hasOwnProperty
方法。
注意: 通过判断一个属性是否 undefined
是不够的。 因为一个属性可能确实存在,只不过它的值被设置为undefined
。
hasOwnProperty
是JavaScript中唯一一个处理属性但是不需要查找原型链的方法。
<span style="font-size:18px;color:#000099;">
// 修改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
</span>
只有 hasOwnProperty
可以给出正确和期望的结果,这在遍历对象的属性时会很有用。 没有其它方法可以用来排除原型链上的属性,而不是定义在对象自身上的属性。
hasOwnProperty
作为属性(hasOwnProperty
as a property)
JavaScript 不会保护 hasOwnProperty
被非法占用,因此如果一个对象碰巧存在这个属性, 就需要使用外部的hasOwnProperty
函数来获取正确的结果。
<span style="color:#000099;">var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 总是返回 false
// 使用其它对象的 hasOwnProperty,并将其上下为设置为foo
{}.hasOwnProperty.call(foo, 'bar'); // true</span>
结论(In conclusion)
当检查对象上某个属性是否存在时,hasOwnProperty
是唯一可用的方法。 同时在使用 for in
loop 遍历对象时,推荐总是使用 hasOwnProperty
方法, 这将会避免原型对象扩展带来的干扰。
另补充:
var cat = new Object;
cat.prototype.toString 判断cat类型
cat.prototype.toString是对象cat 原型object上面的属性,不能被删除