hasOwnProperty函数使用

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
喜欢就支持一下吧
点赞0 分享