細說 Javascript 對象篇(三) : hasOwnProperty

判斷一個屬性是定義在對象自己而不是繼承自原型鏈,咱們須要使用從 Object.prototype 繼承而來的 hasOwnProperty 方法。
hasOwnProperty 方法是 Javascript 中惟一一個處理對象屬性而不會往上遍歷原型鏈的。git

// 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 中沒有其餘方法能判斷一個屬性是定義在對象自己仍是繼承自原型鏈。github

hasOwnProperty 做爲屬性

Javascript 並未將 hasOwnProperty 設爲敏感詞,這意味着你能夠擁有一個命名爲 hasOwnProperty 的屬性。這個時候你沒法再使用自己的 hasOwnProperty 方法來判斷屬性,因此你須要使用外部的 hasOwnProperty 方法來進行判斷。ide

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 將會很好地避免來自原型對象擴展所帶來的困擾。oop

參考

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

相關文章
相關標籤/搜索