hasOwnProperty()
回傳物件是否有該屬性的布林值。
表達式
obj.hasOwnProperty(prop)
參數
prop
- 屬性名稱。
說明
每個為 Object
後代的物件都繼承 hasOwnProperty
方法。這個方法可以被使用來決定物件是否擁有特定的直接屬性;跟 in
不一樣,這個方法並未檢查物件的原型鏈。
範例
使用 hasOwnProperty
測試屬性是否存在
這個範例顯示 o
物件是否擁有名為 prop
的屬性:
o = new Object(); o.prop = 'exists'; function changeO() { o.newprop = o.prop; delete o.prop; } o.hasOwnProperty('prop'); // 回傳 true changeO(); o.hasOwnProperty('prop'); // 回傳 false
直接與繼承的屬性
這個範例區分直接屬性和從原型鍊繼承的屬性:
o = new Object(); o.prop = 'exists'; o.hasOwnProperty('prop'); // 回傳 true o.hasOwnProperty('toString'); // 回傳 false o.hasOwnProperty('hasOwnProperty'); // 回傳 false
遍歷物件的屬性
這個範例顯示如何不執行繼承的屬性去遍歷物件的屬性。注意 for...in
已經遍歷了可以被列舉的項目,所以不該基於缺乏不可列舉的屬性(如下)而假設 hasOwnProperty
被嚴格地限制在列舉的項目(如同 Object.getOwnPropertyNames()
)。
var buz = { fog: 'stack' }; for (var name in buz) { if (buz.hasOwnProperty(name)) { console.log('this is fog (' + name + ') for sure. Value: ' + buz[name]); } else { console.log(name); // toString or something else } }
將 hasOwnProperty
作為屬性
JavaScript 並未保護 hasOwnProperty
;因此,如果一個物件擁有一樣的屬性名稱,為了獲得正確的結果需要使用 external hasOwnProperty
:
var foo = { hasOwnProperty: function() { return false; }, bar: 'Here be dragons' }; foo.hasOwnProperty('bar'); // 總是回傳 false // 使用其他物件的 hasOwnProperty 和 call it with 'this' set to foo ({}).hasOwnProperty.call(foo, 'bar'); // true // 從物件的原型使用 hasOwnProperty 也是可行的 Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
註:在最後一個例子中並未創建任何新的物件。
規範
規範 | 狀態 | 註 |
---|---|---|
ECMAScript 3rd Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.5. |
ECMAScript 5.1 (ECMA-262) The definition of 'Object.prototype.hasOwnProperty' in that specification. |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Object.prototype.hasOwnProperty' in that specification. |
Standard |
瀏覽器相容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |