hasOwnProperty

hasOwnProperty() 方法會返回一個布爾值,這個方法能夠用來檢測一個對象是否含有特定的自身(非繼承)屬性。

一、for...in循環時爲何要在裏面加上if(obj.hasOwnProperty(name))的判斷

這段代碼的意思是:判斷一個對象裏是否含有某個非繼承屬性。this

for...in 循環會遍歷全部可枚舉屬性,加上hasOwnProperty()方法,能夠忽略掉繼承屬性,這樣就能確保遍歷的是Obj的可枚舉的自身屬性。prototype

適用於:含有繼承屬性的對象,也就是除了Object的全部對象code

看下面的例子:對象

function foo() {  
  this.name = 'foo'
  this.sayHi = function () {    
     console.log('Say Hi')
  }
}
 
foo.prototype.sayGoodBy = function () {  
  console.log('Say Good By')
}
 
let myPro = new foo()
console.log(myPro.name) // foo
console.log(myPro.hasOwnProperty('name')) // true
console.log(myPro.hasOwnProperty('toString')) // false
console.log(myPro.hasOwnProperty('hasOwnProperty')) // fasle
console.log(myPro.hasOwnProperty('sayHi')) // true
console.log(myPro.hasOwnProperty('sayGoodBy')) // false
console.log('sayGoodBy' in myPro) // true

二、爲何有的地方用Object.prototype.hasOwnProperty.call(obj,name)

Javascript 並無保護 hasOwnProperty 爲關鍵字或保留字。所以,會有這樣一種狀況:對象本身改寫了hasOwnProperty方法,好比下面代碼中該方法永遠返回false。若是另外一個不知情的人使用了foo,並想經過foo.hasOwnProperty判斷foo是否含有某個屬性時就會永遠返回false,這顯然是有問題的。繼承

這時候能夠藉助於Object.prototype.hasOwnProperty或{}.hasOwnProperty來判斷對象是否含有某個非繼承屬性。ip

適用於:不肯定Object類型變量是否改寫了hasOwnProperty的狀況原型

var foo = { 
  hasOwnProperty: function() { 
    return false; 
  }, 
  bar: 'Here be dragons' 
}; 
 
foo.hasOwnProperty('bar'); // 老是返回 false 
// 使用另外一個 hasOwnProperty 並將 this 設置爲 foo 來調用它 
{}.hasOwnProperty.call(foo, 'bar'); // true

三、總結

  • 建議增長 hasOwnProperty 進行判斷,能夠有效避免擴展本地原型而引發的錯誤
  • 若是對一個Object類型的內部屬性不是很肯定,能夠經過{}.hasOwnProperty.call(obj,name)或Object.prototype.hasOwnProperty.call(obj,name)的方式判斷
相關文章
相關標籤/搜索