簡體   English   中英

我可以安全地擴展 javascript 內置類嗎?

[英]Can I safely extend javascript builtin classes?

我可以安全地擴展 Javascript 內置類,比如Array嗎?

即以下瀏覽器/環境將不起作用:

Array.prototype.double = function() { return  this.concat(this); }
Array.twice = function(a) { return a.double(); }
Array.twice([1, 2, 3]) # => [1, 2, 3, 1, 2, 3]

取決於你對“工作”的定義。

原型擴展存在三個主要問題。

  • 它是全局范圍,因此存在名稱沖突
  • 如果您添加可枚舉屬性,它會中斷for .. in
  • 代碼讀起來很混亂,這是 ES5 特性還是自定義庫?

它將像這樣工作, Array.prototypeArray是可變的,因此您可以添加代碼並調用屬性。

然而:

Array.prototype.trolls = 42;
for (var k in []) {
  alert(k === "trolls");
}

上面是一個例子,它打破for .. in 這很容易解決

Object.defineProperty(Array.prototype, "trolls", {
  value: ...,
  enumerable: false
});

(僅限 ES5。IE<9 中的中斷。不能在傳統引擎中模擬)

或與

for (var k in []) {
  if ([].hasOwnProperty(k)) {
    alert(k === "trolls");
  }
}

出於這些確切的原因,我個人避免自動擴展本地程序。 但是我認為在你的庫中有一個.extendNatives函數是完全可以接受的,比如pd.extendNatives

安全地,不是真的 - 因為你不能確定你是唯一擴展它們的人,或者你實際上擴展了正確的方法(請參閱原型 - 我上次檢查時,它擴展了內置類,這造成了嚴重破壞其他腳本對內置行為的期望)。 修改你不擁有的對象是一條通往非常棘手領域的道路(“哦,但這是實際內置的concat() ,還是其他一些腳本在我們背后改變了它?”)。

有關更詳細的討論,請參見例如: http : //perfectkills.com/extending-built-in-native-objects-evil-or-not/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM