细说 Javascript 对象篇(三) : hasOwnProperty

推断一个属性是定义在对象自身而不是继续自原型链,我们须要运用从 Object.prototype 继续而来的 hasOwnProperty 要领。
hasOwnProperty 要领是 Javascript 中唯一一个处置惩罚对象属性而不会往上遍历原型链的。

// 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 中没有其他要领能推断一个属性是定义在对象自身照样继续自原型链。

hasOwnProperty 作为属性

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 loop 来遍历对象时,运用 hasOwnProperty 将会很好地防止来自原型对象扩大所带来的搅扰。

参考

http://bonsaiden.github.io/JavaScript-Garden/#object.hasownproperty

    原文作者:StephenLee
    原文地址: https://segmentfault.com/a/1190000000480531
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞