首頁  >  文章  >  web前端  >  javascript在哪種情況下不要在Object.prototype中加入可列舉屬性

javascript在哪種情況下不要在Object.prototype中加入可列舉屬性

伊谢尔伦
伊谢尔伦原創
2017-07-26 17:03:171422瀏覽

絕對不要在Object.prototype中加入可列舉的(Enumerable)屬性

如果你的程式碼中依賴for..in迴圈來遍歷Object型別中的屬性的話,不要在Object.prototype中加入任何可列舉的屬性。

但是在對JavaScript執行環境進行增強的時候,往往都需要在Object.prototype物件上新增的屬性或方法。例如可以加入一個方法用來得到某個物件中的所有的屬性名稱:


Object.prototype.allKeys = function() { 
  var result = []; 
  for (var key in this) { 
    result.push(key); 
  } 
  return result; 
};

但是結果是下面這個樣子的:


#
({ a: 1, b: 2, c: 3}).allKeys(); // ["allKeys", "a", "b","c"]

一個可行的解決方案是使用函數而不是在Object.prototype上定義新的方法:


function allKeys(obj) { 
  var result = []; 
  for (var key in obj) { 
    result.push(key); 
  } 
  return result; 
}

但是如果你確實需要向Object.prototype上加入新的屬性,同時也不希望該屬性在for..in迴圈中被遍歷到,那麼可以利用ES5環境提供的Object.defineProject方法:


Object.defineProperty(Object.prototype, "allKeys", { 
  value: function() { 
    var result = []; 
    for (var key in this) { 
      result.push(key); 
    } 
    return result; 
  }, 
  writable: true, 
  enumerable: false, 
  configurable: true 
});

以上程式碼的關鍵部分就是將enumerable屬性設定為false。這樣的話,在for..in迴圈中就無法遍歷該屬性了。

以上是javascript在哪種情況下不要在Object.prototype中加入可列舉屬性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn