1. 程式人生 > 實用技巧 >Object.prototype.hasOwnProperty.call()

Object.prototype.hasOwnProperty.call()

JavaScript中Object物件原型上的hasOwnProperty()用來判斷一個屬性是定義在物件本身而不是繼承自原型鏈。

obj.hasOwnProperty(prop)

引數 prop

要檢測的屬性 字串 名稱或者Symbol(ES6)

  1. o = new Object();

  2. o.prop = 'exists';

  3. o.hasOwnProperty('prop'); // 返回 true

  4. o.hasOwnProperty('toString'); // 返回 false

  5. o.hasOwnProperty('hasOwnProperty'); // 返回 false

使用hasOwnProperty作為某個物件的屬性名

因為javascript沒有將hasOwnProperty作為一個敏感詞,所以我們很有可能將物件的一個屬性命名為hasOwnProperty,這樣一來就無法再使用物件原型的 hasOwnProperty 方法來判斷屬性是否是來自原型鏈。

  1. var foo = {

  2. hasOwnProperty: function() {

  3. return false;

  4. },

  5. bar: 'Here be dragons'

  6. };

  7. foo.hasOwnProperty('bar'); // 始終返回 false

不能使用該物件.hasOwnProperty

這種方法,怎麼來解決這個問題呢?我們需要使用原型鏈上真正的 hasOwnProperty 方法:

  1. ({}).hasOwnProperty.call(foo, 'bar'); // true

  2. // 或者:

  3. Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

MDN

Why use Object.prototype.hasOwnProperty.call(myObj, prop) instead of myObj.hasOwnProperty(prop)?

總的來說,使用Object.prototype.hasOwnProperty.call()有三方面的原因:

  1. If obj inherits from null not Object.prototype
  2. If hasOwnProperty has been redeclared on obj
  3. If hasOwnProperty has been redeclared in obj's prototype chain

參考:Object.prototype.hasOwnProperty.call() vs Object.prototype.hasOwnProperty()

在我們日常開發中,物件的使用頻率很高,我們計算陣列的長度是非常方便的,但是如何計算物件的長度呢?
假如我們有一個圖書館的專案,專案中有一組圖書和作者,像下面這樣:

[javascript]view plaincopy

  1. varbookAuthors={
  2. "FarmerGilesofHam":"J.R.R.Tolkien",
  3. "OutoftheSilentPlanet":"C.S.Lewis",
  4. "ThePlaceoftheLion":"CharlesWilliams",
  5. "PoeticDiction":"OwenBarfield"
  6. };

我們分析現在的需求,我們給一個API傳送資料,但是書的長度不能超過100,因此我們需要在傳送資料之前計算在一個物件中總共有多少本書。那麼我們總怎麼做呢?我們可能會這樣做:

[javascript]view plaincopy

  1. functioncountProperties(obj){
  2. varcount=0;
  3. for(varpropertyinobj){
  4. if(Object.prototype.hasOwnProperty.call(obj,property)){
  5. count++;
  6. }
  7. }
  8. returncount;
  9. }
  10. varbookCount=countProperties(bookAuthors);
  11. //Outputs:4
  12. console.log(bookCount);

這是可以實現的,幸運的是Javascript提供了一個更改的方法來計算物件的長度:

[javascript]view plaincopy

  1. varbookAuthors={
  2. "FarmerGilesofHam":"J.R.R.Tolkien",
  3. "OutoftheSilentPlanet":"C.S.Lewis",
  4. "ThePlaceoftheLion":"CharlesWilliams",
  5. "PoeticDiction":"OwenBarfield"
  6. };
  7. vararr=Object.keys(bookAuthors);
  8. //Outputs:Array["FarmerGilesofHam","OutoftheSilentPlanet","ThePlaceoftheLion","PoeticDiction"]
  9. console.log(arr);
  10. //Outputs:4
  11. console.log(arr.length);


下面我們來對陣列使用keys方法:

[javascript]view plaincopy

  1. vararr=["zuojj","benjamin","www.zuojj.com"];
  2. //Outputs:["0","1","2"]
  3. console.log(Object.keys(arr));
  4. //Outputs:3
  5. console.log(arr.length);

Object.keys() 方法會返回一個由給定物件的所有可列舉自身屬性的屬性名組成的陣列,陣列中屬性名的排列順序和使用for-in迴圈遍歷該物件時返回的順序一致(兩者的主要區別是 for-in 還會遍歷出一個物件從其原型鏈上繼承到的可列舉屬性)。