覆盖现代浏览器中的全局变量

Override globals in modern browsers

本文关键字:全局变量 浏览器 覆盖      更新时间:2023-09-26

我刚刚读了John Resig关于在浏览器(例如Array)中重写全局变量的文章,但当我在浏览器中尝试该示例时,没有发生任何事情。

这里的代码:

var sec = {};
function Array() { 
    alert(1); 
    sec = this; 
}; 

当我在浏览器控制台中运行["zdxc", "sd", 1111, 11.1]时,什么也没发生。已声明数组,但未显示警报。

这是一个在现代浏览器中修复的错误,还是在某些版本的浏览器中仍然有效?

这是因为您覆盖了使调用new Array();返回自定义对象而不是实际Array的Array构造函数。

所以呼叫

var arr = ["zdxc", "sd", 1111, 11.1];

使得CCD_ 4成为本地CCD_。

调用

var arr_override = new Array();

使arr_override成为您之前声明的类型的Object,从而执行您的alert-语句。重写构造函数会从标识符中"擦除"Array-初始化,用构造函数函数替换它。它不是一个真正的Array

根据这个问题的答案,自2008年以来,在所有主要浏览器中,Array Literal([])都没有受到这种行为的影响。。

编辑:

经过一番尝试,似乎不可能修改[]符号的行为,也不建议修改本机对象(尤其是它们的构造函数)

如何可能扩展原型并修改现有的属性/方法,如下面的示例

var arr = [];
arr.push('2323');
alert(arr);
Array.prototype.push = function() { alert('trololololo'); }
arr.push(123);

希望这能有所帮助。干杯