【发布时间】:2017-03-13 13:50:45
【问题描述】:
我读过一些文章,其中建议在 JavaScript 中扩展内置对象是一个坏主意。例如,我将first 函数添加到Array...
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 时会发生什么?
【问题讨论】:
-
永远无法避免碰撞。您可以做的最好的事情是尽可能唯一地命名您的实体,并尽可能少地包含全局元素,例如命名空间......并交叉手指。
-
提示:你的
first方法已经可用于名称为find的数组,因为 ES6。 -
@Bergi 当然。但问题不取决于细节
标签: javascript