將方法添加到像Object,Function,Array,String等原生JavaScript對象被認爲是不好的做法。將方法添加到原生JavaScript對象
但我不明白爲什麼?
有些身體可以解釋這一點嗎?
在此先感謝。
將方法添加到像Object,Function,Array,String等原生JavaScript對象被認爲是不好的做法。將方法添加到原生JavaScript對象
但我不明白爲什麼?
有些身體可以解釋這一點嗎?
在此先感謝。
因爲您可能碰巧使用定義了具有相同名稱的函數的庫,但是以另一種方式工作。
通過覆蓋它,你打破了他人的圖書館的行爲,然後你在調試模式下抓你的頭。
編輯
如果你真的想用一個非常不愉快的名稱,如prependMyCompanyName(...)
方法添加到String
原型,我認爲這幾乎是無風險從一個角度壓倒一切的點。但我希望你不必經常輸入它...
最好的方法來做到這一點仍然是愚蠢的意見,例如定義一個MyCompanyUtils
對象(你可以找到一個快捷方式如$Utils
),並使其具有prepend(str,...)
方法。
在我看來這兩個大的原因是:
它使你的代碼難以閱讀。你編寫一次代碼並閱讀它多次。如果你的代碼最終落入另一個人手中,他可能不會立即知道你的所有對象都有一個.to_whatever方法。
它會導致命名空間衝突的可能性。如果您嘗試將覆蓋Object.prototype的庫放入另一個庫中,則可能會導致其他人執行相同操作的問題。
還存在增強對象的原型對for...in
效果循環考慮:
Object.prototype.foo = 1;
var obj = {
bar: 2
};
for (var i in obj) {
window.alert(i);
}
// Alerts both "foo" and "bar"
說,如果我在String對象增加一個功能prependMyCompanyUSP(),它會如何影響其他圖書館。對不起,如果我問轉儲問題。一個例子可能會清楚我的搖滾頭。 – rajakvk 2009-09-21 12:05:06
如果使用通用名稱,則可能最終會使用函數從庫或更高版本的規範中替換(或替換)函數。 例如。刪除額外格式的String.prototype.trim = function(){...} 會導致新ES實現中的錯誤行爲(在ES5中存在String.prototype.trim)。 通過做String.prototype.myCompanyNameTrim =函數.... 你是不太可能得到一個名稱衝突。 – olliej 2009-09-21 19:28:42
@olliej完美。我現在明白了。謝謝。害羞!! – rajakvk 2009-09-22 06:51:53