javascript - 扩展 JavaScript 的内置类型——它是邪恶的吗?

标签 javascript

<分区>

我读过几篇文章,建议在 JavaScript 中扩展内置对象是个坏主意。例如,我向 Array 添加了一个 first 函数...

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 类型,它甚至没有第一个方法。现在发生了什么?

本文的症结归结于此;扩展内置类型到底有多糟糕,我们如何才能避免 future 的实现冲突?

注意:使用 namespace 可能是解决此问题的一种方法,但话又说回来,事实并非如此!

var Collection = {
    Enumerable: function () { ... }
};

当 ECMAScript 规范引入 Collection 时会发生什么?

最佳答案

这正是您必须尽可能少地污染全局命名空间的原因。完全避免任何类型冲突的唯一方法是在 IIFE 中定义所有内容:

(function () {
    let Collection = ...
})();

当且仅当您需要定义全局对象时,例如因为您是一个图书馆并且您希望被第 3 方使用,您应该定义一个极不可能发生冲突的名称,例如因为它是您的公司姓名:

new google.maps.Map(...)

任何时候你定义一个全局对象,其中包括现有类型的新方法,你都在冒着其他库或 future 的 ECMAScript 标准试图在未来某个时候采用该名称的风险。

关于javascript - 扩展 JavaScript 的内置类型——它是邪恶的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40342870/

相关文章:

javascript - 如何设置A框模型的尺寸?

javascript - 我现有功能的内部是什么? Javascript

javascript - 使用 onclick 更改图像以获取 100 个不同的图像链接

javascript - 如何在 react 中将商品添加到购物车页面

javascript - 在 Javascript 中验证 var 是否是有效的日期时间对象

javascript - 更新嵌套数组中的多个对象

javascript - Web 应用程序性能 : SVG, Canvas 或 Dom 操作

javascript - 如何从 Chrome 扩展程序向我网站的 php 发送简单消息?

javascript - Rails 和 Stripe 支付

javascript - Javascript Array.sort() 的意外行为