hasOwnProperty() 方法會返回一個布爾值,這個方法能夠用來檢測一個對象是否含有特定的自身(非繼承)屬性。
這段代碼的意思是:判斷一個對象裏是否含有某個非繼承屬性。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
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