我刚刚阅读John Resig article关于覆盖浏览器中的全局变量(例如数组),但是当我在浏览器中尝试该示例时,没有任何事情发生。
这里是代码:
var sec = {};
function Array() {
alert(1);
sec = this;
};
当我在浏览器的控制台中运行["zdxc", "sd", 1111, 11.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);
希望这会有所帮助。干杯!