在JavaScript中重写数组文字

Overriding array literal in JavaScript

本文关键字:数组 文字 重写 JavaScript      更新时间:2023-09-26

我的应用程序(一个自定义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不同的原型?

没有。这实际上是使用字面量的好处之一。:-)但是在你特殊的特殊情况下,这就不那么有用了。

只是为了完整:

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

例如:

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这样的东西,即使它们存在…)。