[英]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.