我刚刚阅读了有关在浏览器中覆盖全局变量(例如数组)的John Resig 文章,但是当我在浏览器中尝试该示例时,什么也没发生。
这里的代码:
var sec = {};
function Array() {
alert(1);
sec = this;
};
当我["zdxc", "sd", 1111, 11.1]
在浏览器的控制台中运行时,什么也没发生。已声明数组且未显示警报。
这是在现代浏览器中修复的错误还是在某些版本的浏览器中仍然有效?
我刚刚阅读了有关在浏览器中覆盖全局变量(例如数组)的John Resig 文章,但是当我在浏览器中尝试该示例时,什么也没发生。
这里的代码:
var sec = {};
function Array() {
alert(1);
sec = this;
};
当我["zdxc", "sd", 1111, 11.1]
在浏览器的控制台中运行时,什么也没发生。已声明数组且未显示警报。
这是在现代浏览器中修复的错误还是在某些版本的浏览器中仍然有效?
那是因为您覆盖了 Array-contructor,这使得调用new Array();
返回您的自定义对象,该对象由实际的Array
.
所以打电话
var arr = ["zdxc", "sd", 1111, 11.1];
让arr
beeing成为本地人Array
。
打电话
var arr_override = new Array();
使arr_override
beeing 成为Object
您之前声明的类型,因此执行您的alert
-statement。覆盖构造函数类型的“擦除”Array
标识符中的 -initialisation 将其替换为构造函数。它不是一个实际的Array
.
根据对这个问题的回答,自 2008 年左右以来,所有市长浏览器中的 Array-Literal ( []
) 都没有受到这种行为的影响。
编辑:
在尝试了一下之后,似乎不可能修改[]
-notation 的行为,也不建议修改 Native Objects(特别是它们的构造函数)。
如何扩展原型并修改现有属性/方法,如下例所示
var arr = [];
arr.push('2323');
alert(arr);
Array.prototype.push = function() { alert('trololololo'); }
arr.push(123);
希望这可以帮助。干杯!