[英]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.