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

时间:2013-02-11 08:10:14

标签: javascript json security

我刚刚阅读John Resig article关于覆盖浏览器中的全局变量(例如数组),但是当我在浏览器中尝试该示例时,没有任何事情发生。

这里是代码:

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

当我在浏览器的控制台中运行["zdxc", "sd", 1111, 11.1]时,没有任何事情发生。声明了数组,没有显示警告。

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

1 个答案:

答案 0 :(得分:2)

这是因为你覆盖了Array-contructor,这使得调用new Array();返回了一个真实Array的自定义对象。

所以打电话

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

使arr成为原生Array

致电

var arr_override = new Array();

使arr_override成为您之前声明的Object类型,从而执行alert - 语句。覆盖构造函数类“擦除”Array - 从标识符初始化,用构造函数替换它。它不是实际的Array

根据the answer to this question,自2008年以来所有市长浏览器中,Array-Literal([])并没有受到此行为的影响。

修改

尝试了一下之后,似乎无法修改[] - 符号的行为,并且不建议在所有btw中修改本机对象(特别是它们的构造函数)。

如何扩展原型以及修改现有的属性/方法,如下例所示

var arr = [];
arr.push('2323');
alert(arr);

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

希望这会有所帮助。干杯!