簡體   English   中英

在Javascript中向Object.prototype添加方法有什么好處和危險?

[英]What are the benefits and dangers of adding methods to Object.prototype in Javascript?

我知道五年前這是一個有爭議的問題,但我想知道今天的JavaScript是否有所改變。 是否存在與擴展Object.prototype不兼容的主要現代庫的現實示例?

我對假設“有人可能會for in你想要使用的庫for in迭代代碼中寫不好,也許在未來,然后你可能會得到一個奇怪的錯誤”感興趣

是否存在與擴展Object.prototype不兼容的主要現代庫的現實示例?

是的,我記得jQuery的問題 - 例如,它是一個較少侵入的庫 - 例如:

我記得的另一個案例是有人向Object.prototype對象添加了一個load函數,它導致了$().load事件的問題:

// DON'T DO THIS ! :)
Object.prototype.load = function () {};

​$(window).load(function () {
  alert('load event'); // never fired
});​

這里的例子。

永遠不建議以這種方式Object.prototype對象,因為這些屬性將由大量對象繼承 - 即使是某些宿主對象 - 並且如您所知,主要關注的是它們將被枚舉for-in聲明。

在ECMAScript 5中,現在存在一種更安全的方式,因為我們現在可以聲明不可枚舉的屬性,例如:

Object.defineProperty(Object.prototype, 'foo', { value: 'bar' });

在屬性描述符- { value: 'bar' } -我們可以指定屬性的屬性,在值屬性的情況下,在上面的例子中,我們可以指定writable屬性,和共用configurable屬性(判斷是否一個屬性可以是重新配置 - 屬性更改 - 或刪除。

我們還有enumerable屬性,它確定是否由for-in語句enumerable屬性。

如果我們沒有指定屬性,默認情況下它們是false ,描述符將如下所示:

{
  value: 'bar',
  writable: false,
  configurable: false,
  enumerable: false
}

暫無
暫無

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

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