我讀過一些文章,建議在JavaScript中擴展內置對象是一個壞主意。例如說,我添加了一個first
功能Array
...擴展JavaScript的內置類型 - 它是邪惡的嗎?
Array.prototype.first = function(fn) {
return this.filter(fn)[0];
};
大,所以現在我可以得到基於謂詞的第一個元素。但是,當ECMAScript-20xx決定首先添加到規範並實現它不同時會發生什麼? - 好了,一下子,我的代碼假設一個非標準的實現,開發商失去信心等
於是我決定創建自己的類型......
var Enumerable = (function() {
function Enumerable(array) {
this.array = array;
}
Enumerable.prototype.first = function (fn) {
return this.array.filter(fn)[0];
};
return Enumerable;
}());
所以現在,我可以將一個數組傳遞給一個新的Enumerable,並首先調用Enumerable實例。大!我尊重ECMAScript-20xx規範,我仍然可以做我想做的事情。
然後發佈ES20XX + 1規範,它引入了一個Enumerable
類型,它甚至沒有第一種方法。現在會發生什麼?
本文的癥結歸結於此;擴展內置類型有多糟,以及我們如何避免將來的實現衝突?
注意:命名空間的使用可能是解決這個問題的一種方法,但是它又不是這樣!
var Collection = {
Enumerable: function() { ... }
};
當ECMAScript規範引入Collection
時會發生什麼?
永遠不能避免碰撞。你所能做的最好的事情就是儘可能地爲你的實體命名,儘可能少地使用全局元素,比如命名空間。並且交叉你的手指。 –
另請參見[我可以安全地擴展JavaScript內置類?](http://stackoverflow.com/q/8262751/1048572),[擴展本地內置](http://perfectionkills.com/extending-native-builtins), [JavaScript:擴展Array.prototype有什麼危險?](http://stackoverflow.com/q/8859828/1048572),[使用Prototype擴展本地對象不好?](http://stackoverflow.com/q/10197174/1048572),[爲什麼擴展原生對象是一種不好的做法?](http://stackoverflow.com/q/14034180/1048572),[在ECMAScript 5之後重新擴展原生原型](http://stackoverflow.com/q/11781878/1048572)等等。 – Bergi
提示:您的'第一個'方法已經可用於名稱['find'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)自ES6以來。 – Bergi