在node.js中更改Array.prototype

时间:2016-09-19 17:39:41

标签: javascript arrays node.js prototypejs

我想让一些函数可用于我的所有数组。

例如,我想要一个删除重复项的函数:

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)好。

4 个答案:

答案 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是不好的做法吗?我认为多次编写代码似乎很愚蠢。

有两个思想阵营:

  1. 是的,这很糟糕。您可能会遇到与其他人添加他们自己的uniq的命名冲突。结合来自多个来源的代码变得非常非常普遍,增加了这些问题的可能性。该语言的未来版本可能会添加uniq。由于委员会指导语言(TC-39)试图引导潜在的冲突,如果你的客户端图书馆变得流行,它将使他们的工作更难。 (MooTools不止一次。)

  2. 不,它不错,它的原型是什么。命令冲突可以在何时和何时处理。 TC-39可以把它弄糊涂。

  3. 你必须自己决定是否这样做。

答案 1 :(得分:1)

另一个选择是扩展数组类,以便您可以充分利用这两个世界......

您可以向扩展的newArray类添加所需的任何方法,同时不会污染全局命名空间。

就浏览器而言 - 你必须做同样的事情,虽然这取决于你是否正在将ES6转换为ES5,限制自己使用ES6浏览器,或者如果你正在寻找一种方法事情也在ES5中发挥作用。

使用工厂函数返回newArray类型将是一种方法 - 注意确保您添加的任何方法都不可迭代。

这里有一个讨论:

Extending Array with ES6 classes

答案 2 :(得分:0)

被认为是"不良做法"操纵数组原型。

我(个人)认为用一种非常独特的东西来做这件事并不是那么糟糕。名字,但很难找到唯一的名字。

最好有一些可以在需要时调用和使用的实用程序功能。

答案 3 :(得分:0)

对于您希望在应用程序中多次使用的此类方法,您可以创建如下文件:

<强> appUtils.js

var appUtils = {};

appUtils.getUniqueArray = function () {
  return Array.from(new Set(this));
};

// can add other methods as well

您可以在任何想要使用此功能的地方使用此文件。如果您有其他可重用的方法,那么可以像上面一样添加它们。