Object.prototype.hasOwnProperty()

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)

參見

文件標籤與貢獻者

標籤: 
 此頁面的貢獻者: Shiyou, alk03073135
 最近更新: Shiyou,