在JavaScript中覆盖数组文字

时间:2014-08-01 16:38:23

标签: javascript arrays prototype

我的应用程序(自定义Web浏览器)将代码注入到具有修改后的Array原型的页面中(特别是因为它使用prototype.js)。我想确保我注入的代码使用正常的Array。我正在使用https://stackoverflow.com/a/15147986/502149中的代码来重置原型,如果我说:

,这可以正常工作
(function(Array) {
  var array = new Array();
)(ArrayWithUnmodifiedPrototype);

但是,如果我说:

,我仍然可以获得修改后的原型
(function(Array) {
  var array = [];
)(ArrayWithUnmodifiedPrototype);

我不确定这是否会成为一个问题(我注入的代码中的某些第三方库理论上可以使用[]),但无论哪种方式,我都很好奇:有没有覆盖[]的任何方式,以便它使用与全局范围内当前Array.prototype不同的原型?

1 个答案:

答案 0 :(得分:3)

不,没有。这实际上是使用文字的好处之一。 :-)但是在你特殊的不寻常情况下,它没那么有用。

为了完整性:

鉴于你确实有一个未被修改的Array.prototype的引用(我基于你的ArrayWithUnmodifiedPrototype符号),你可以通过每次交换东西来解决这个问题需要创建一个数组或调用其中一个第三方库。 (这显然不太理想。)

E.g:

var oldPrototype = Array.prototype;
Array.prototype = ArrayWithUnmodifiedPrototype.prototype;
/*...call third-party lib that might use []...*/
Array.prototype = oldPrototype;

但是如果第三方的东西正在处理ajax回调等事情,那么你可能很难将代码放到原来的交换原型中。

可能最好的办法是确保你注入的代码适用于Array.prototype的任何合理的修改(例如PrototypeJS所做的那些,尽管它仍然会被覆盖,但这些修改大多是合理的。像Array.prototype.map这样的东西,即使它们在那里......)。