Javascript 仅在模块内使用修改的Array.prototype

Javascript 仅在模块内使用修改的Array.prototype,javascript,arrays,Javascript,Arrays,我正在一个更大的代码库中创建一个模块。在一些情况下,我需要能够在较大的数组中连接子数组,以便将数组展平为仅一维。有几个库在方法名concatAll()下提供类似的功能 这就是功能: Array.prototype.concatAll = function concatAll() { return Array.prototype.concat.apply([], this); }; 此解决方案的问题在于,它在整个代码库的每个实例中修改了Array.prototype。我希望能够将此数组方

我正在一个更大的代码库中创建一个模块。在一些情况下,我需要能够在较大的数组中连接子数组,以便将数组展平为仅一维。有几个库在方法名
concatAll()
下提供类似的功能

这就是功能:

Array.prototype.concatAll = function concatAll() {
    return Array.prototype.concat.apply([], this);
};
此解决方案的问题在于,它在整个代码库的每个实例中修改了
Array.prototype
。我希望能够将此数组方法链接到其他数组方法,因此我不能只创建一个执行此操作的函数

myArray
  .filter(...)
  .map(...)
  .concatAll();
我知道我可以
删除Array.prototype.concatAll
,但是我们的模块加载器是这样的,我只知道模块何时需要引导到页面,而不知道模块何时“取消”引导。因此,调用
delete Array.prototype.concatAll将使该方法在模块中不可用


有没有一种方法可以暂时将此方法添加到模块内的阵列原型中,而不让每个阵列实例都继承该方法?

第一个想法是安排在单独的环境中运行带有增强阵列原型的代码,例如iframe或web worker。每个这样的环境中的
数组
对象是独立的,对其中一个的更改不会影响其他环境

或者,假设您担心其他人不会覆盖您的方法,您可以将其定义为:

Object.defineProperty(Array.prototype, "concatAll", {
  get: function () {
    return function concatAll() {
      return Array.prototype.concat.apply([], this);
    };
  },
  set: function() {
    throw new Error("Attempt to overwrite Array#concatAll!");
  }
});
如果其他人试图通过赋值重新定义它,至少会抛出一个错误。尝试通过另一个
对象重新定义它。defineProperty
也会抛出,因为默认情况下该属性是不可配置的

可能是次要的一点:

这个解决方案的问题在于它修改了整个代码库的每个实例中的Array.prototype


当然,从技术上讲,不会修改任何实例。如果你的意思是每个实例都会从原型中获取新方法,那当然是真的,但是你具体担心什么呢?

没有。如果其他实例尝试使用它,您可以尝试限制损害,但仅此而已。或者将其封装在只有您的模块使用的自定义数组扩展中。您可以尝试使用自定义数组方法对数组进行子类化。。但是,由于数组是特殊的,如果这篇文章中描述的解决方案适合您的需要,那么可能会比较混乱。是的-可以通过包装原始数组并使用自定义数组来完成,而不是创建自己的数组类,或者可以添加数组对象函数:
myArray.concatAll=function concatAll(){return Array.prototype.concat.apply([],this);};
ofc,更好的解决方案是创建自己的类并扩展arrayRelated: