hasOwnProperty
是Object.prototype的一个方法
他能判断一个对象是否包含自定义属性而不是原型链上的属性
hasOwnProperty
是 JavaScript 中唯一一个处理属性但是不查找原型链的函数
Object.prototype.chang = 1;
var foo = {goo: undefined}; //对象
foo.chang; // 1
'bar' in foo; // true
foo.hasOwnProperty('chang'); // false chang是原型上的
foo.hasOwnProperty('goo'); // true
//在js中只有hasOwnProperty方法可以用来排除原型链上的属性,而不是定义在对象自身上的属性。
复制代码
JavaScript 不会保护 hasOwnProperty 被非法占用,因此如果一个对象碰巧存在这个属性,就需要使用外部的 hasOwnProperty 函数来获取正确的结果
var foo = {
hasOwnProperty: function() { //已经存在的
return false;
},
chang: '收购腾讯'
};
foo.hasOwnProperty('chang'); // 总是返回 false
// 使用{}对象的 hasOwnProperty,并将其上下为设置为foo
{}.hasOwnProperty.call(foo, 'chang'); // true
复制代码
当检查对象上某个属性是否存在时,hasOwnProperty 是唯一可用的方法。同时在使用 for in loop 遍历对象时,推荐总是使用 hasOwnProperty 方法,这将会避免原型对象扩展带来的干扰
Object.prototype.chang = 1;
var foo = {oo: 2};
for(var i in foo) { //for … in 循环不仅可以遍历数字键名,还会遍历原型上的值和手动添加的其他键
console.log(i); // 输出两个属性:chang 和 oo
}
// 没办法改变for in语句的行为,所以想过滤结果就只能使用hasOwnProperty 方法
// 修改代码如下
for(var i in foo) {
if (foo.hasOwnProperty(i)) { //判断去掉原型上的
console.log(i);
}
}
//使用了 hasOwnProperty,所以这次只输出 oo。
//如果不使用 hasOwnProperty,则这段代码在原生对象原型(比如 Object.prototype)被扩展时可能会出错
//注意通过判断一个属性是否undifined 是不够的 因为一个属性确实存在 只不过它的值被设置为undefined
复制代码
如果有错误或者不严谨的地方,请留言备注,十分感谢,对作者也是一种鼓励。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END