繁体   English   中英

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

[英]Use modified Array.prototype only within module

我正在努力在更大的代码库中创建模块。 在某些情况下,我需要能够在较大的数组中串联子数组,因此该数组只能展平到一个维度。 在方法名称concatAll()下,有一些库提供类似的功能。

这是功能:

Array.prototype.concatAll = function concatAll() {
    return Array.prototype.concat.apply([], this);
};

该解决方案的问题在于,它会修改整个代码库的每个实例中的Array.prototype 我希望能够将此数组方法链接到其他Array方法,所以我不能只创建执行此操作的函数。

myArray
  .filter(...)
  .map(...)
  .concatAll();

我知道我可以delete Array.prototype.concatAll ,但是我们的模块加载delete Array.prototype.concatAll我只知道何时需要将模块引导到页面,而不知道何时模块被“ un”引导。 因此,调用delete Array.prototype.concatAll将使该方法在模块中不可用。

有没有一种方法可以在不使每个数组实例都继承该方法的情况下,将该方法临时添加到模块内的Array原型中?

第一个想法是安排使代码和扩展数组原型一起在单独的环境(例如iframe或网络工作者)中运行。 每个这样的环境中的Array对象都是独立的,对一个对象的更改不会影响其他对象。

或者,假设您担心别人没有覆盖您的方法,则可以按以下方式定义它:

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!");
  }
});

如果其他人尝试通过分配重新定义它,则至少会引发错误。 尝试通过另一个Object.defineProperty重新定义它,因为默认情况下该属性不可配置,因此也会抛出该Object.defineProperty

可能是次要点:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM