更改node.js中的Array.type [英] Change Array.prototype in node.js

查看:34
本文介绍了更改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是不是很糟糕?我只是觉得多次编写代码似乎很愚蠢。

关于这一点有两个阵营:

  1. 是的,很糟糕。您可能会遇到命名冲突,因为其他人添加了自己的、不同的uniq。组合来自多个来源的代码正变得非常非常常见,这增加了出现这些问题的可能性。该语言的未来版本可能会添加uniq。由于指导语言的委员会(TC-39)试图避开潜在的冲突,如果您的客户端库变得流行起来,这将使他们的工作变得更加困难。(MooTools不止一次。)

  2. 不,这不坏,这就是原型的用途。如果和何时,命名冲突都可以处理。TC-39可以接受。

你必须自己决定是否做这件事。

这篇关于更改node.js中的Array.type的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆