我想让一些函数可用于我的所有数组。
例如,我想要一个删除重复项的函数:
Array.prototype.uniq = function () {
return Array.from(new Set(this));
};
但是我想让这个功能在我的整个node.js
项目中起作用。
如果我只是将其放入server.js
中,当我输入npm start
时运行它会不会有效?
如果它也适用于客户端,那将会很棒。是否有可能或者我应该认为服务器和客户端彼此严格分开?
这样延长Array.prototype
是不好的做法吗?我认为多次编写代码似乎很愚蠢。
另一种选择可能是使用
function uniquify(arr) {
return Array.from(new Set(arr));
}
但array.uniq()
似乎比uniquify(array)
好。
答案 0 :(得分:4)
首先:如果您要向Array.prototype
添加属性, 不要 通过简单的分配添加属性。这样做会创建可枚举的属性,并且依赖于默认情况下没有任何可枚举属性的数组的代码将会中断。
所以请改用defineProperty
:
Object.defineProperty(Array.prototype, "uniq", {
value: function uniq() {
return Array.from(new Set(this));
}
});
问题:
如果我只是将其放入
server.js
中,当我输入npm start
时运行它会不会有效?
我不确定您正在谈论的server.js
是什么,但如果您正在谈论修改Node内置部分或npm
的文件而非我强烈建议不这样做。
如果它也适用于客户端,那将会很棒。是否有可能或者我应该认为服务器和客户端彼此严格分开?
他们完全分开了。如果您想在客户端上执行此操作,则需要在客户端上添加添加uniq
的脚本。
这样延长
Array.prototype
是不好的做法吗?我认为多次编写代码似乎很愚蠢。
有两个思想阵营:
是的,这很糟糕。您可能会遇到与其他人添加他们自己的uniq
的命名冲突。结合来自多个来源的代码变得非常非常普遍,增加了这些问题的可能性。该语言的未来版本可能会添加uniq
。由于委员会指导语言(TC-39)试图引导潜在的冲突,如果你的客户端图书馆变得流行,它将使他们的工作更难。 (MooTools不止一次。)
不,它不错,它的原型是什么。命令冲突可以在何时和何时处理。 TC-39可以把它弄糊涂。
你必须自己决定是否这样做。
答案 1 :(得分:1)
另一个选择是扩展数组类,以便您可以充分利用这两个世界......
您可以向扩展的newArray
类添加所需的任何方法,同时不会污染全局命名空间。
就浏览器而言 - 你必须做同样的事情,虽然这取决于你是否正在将ES6转换为ES5,限制自己使用ES6浏览器,或者如果你正在寻找一种方法事情也在ES5中发挥作用。
使用工厂函数返回newArray
类型将是一种方法 - 注意确保您添加的任何方法都不可迭代。
这里有一个讨论:
答案 2 :(得分:0)
被认为是"不良做法"操纵数组原型。
我(个人)认为用一种非常独特的东西来做这件事并不是那么糟糕。名字,但很难找到唯一的名字。
最好有一些可以在需要时调用和使用的实用程序功能。
答案 3 :(得分:0)
对于您希望在应用程序中多次使用的此类方法,您可以创建如下文件:
<强> appUtils.js 强>
var appUtils = {};
appUtils.getUniqueArray = function () {
return Array.from(new Set(this));
};
// can add other methods as well
您可以在任何想要使用此功能的地方使用此文件。如果您有其他可重用的方法,那么可以像上面一样添加它们。