2009-09-21 48 views
2

將方法添加到像Object,Function,Array,String等原生JavaScript對象被認爲是不好的做法。將方法添加到原生JavaScript對象

但我不明白爲什麼?

有些身體可以解釋這一點嗎?

在此先感謝。

回答

6

因爲您可能碰巧使用定義了具有相同名稱的函數的庫,但是以另一種方式工作。

通過覆蓋它,你打破了他人的圖書館的行爲,然後你在調試模式下抓你的頭。

編輯

如果你真的想用一個非常不愉快的名稱,如prependMyCompanyName(...)方法添加到String原型,我認爲這幾乎是無風險從一個角度壓倒一切的點。但我希望你不必經常輸入它...

最好的方法來做到這一點仍然是愚蠢的意見,例如定義一個MyCompanyUtils對象(你可以找到一個快捷方式如$Utils),並使其具有prepend(str,...)方法。

+0

說,如果我在String對象增加一個功能prependMyCompanyUSP(),它會如何影響其他圖書館。對不起,如果我問轉儲問題。一個例子可能會清楚我的搖滾頭。 – rajakvk 2009-09-21 12:05:06

+0

如果使用通用名稱,則可能最終會使用函數從庫或更高版本的規範中替換(或替換)函數。 例如。刪除額外格式的String.prototype.trim = function(){...} 會導致新ES實現中的錯誤行爲(在ES5中存在String.prototype.trim)。 通過做String.prototype.myCompanyNameTrim =函數.... 你是不太可能得到一個名稱衝突。 – olliej 2009-09-21 19:28:42

+0

@olliej完美。我現在明白了。謝謝。害羞!! – rajakvk 2009-09-22 06:51:53

1

在我看來這兩個大的原因是:

  1. 它使你的代碼難以閱讀。你編寫一次代碼並閱讀它多次。如果你的代碼最終落入另一個人手中,他可能不會立即知道你的所有對象都有一個.to_whatever方法。

  2. 它會導致命名空間衝突的可能性。如果您嘗試將覆蓋Object.prototype的庫放入另一個庫中,則可能會導致其他人執行相同操作的問題。

1

還存在增強對象的原型對for...in效果循環考慮:

Object.prototype.foo = 1; 

var obj = { 
    bar: 2 
}; 

for (var i in obj) { 
    window.alert(i); 
} 

// Alerts both "foo" and "bar"