更改node.js中的Array.type
我希望使某些函数可用于我的所有数组。
例如,我想要一个删除重复项的函数:
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)
好。
解决方案
首先:如果要向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可以接受。
你必须自己决定是否做这件事。
相关文章