我试图覆盖window.alert以传递多个参数。
请有人解释一下为什么for / in将Array.prototype.tester的主体继承到列表中?
非常感谢。
Array.prototype.tester = function() {
return 'tester';
}
window.alert = function() {
var args = Array.prototype.slice.call(arguments);
var list = [];
for (var i in args) {
list.push(args[i]);
}
return list.join(', '); // WHY???? alerts: "arg1, arg2, function () { return "tester"; }"
//return args.join(', '); // alerts: "arg1, arg2" expected.
}
alert('arg1', 'arg2');
答案 0 :(得分:2)
for-in
遍历对象的所有可枚举属性,包括对象或其原型中定义的任何内容。大多数内置函数都声明为不可枚举,因此它们在正常迭代期间不会出现。 ECMAScript 5允许您将自己的属性定义为不可枚举,但我不确定哪些浏览器支持此属性:
function testerFunc() {
return 'tester';
}
Object.defineProperty(Array.prototype, 'tester', {
value: testerFunc,
writable: true,
enumerable: false,
configurable: true
});
答案 1 :(得分:0)
window.alert
是一个常量函数,你不能直接重新定义它:
答案 2 :(得分:0)
如casablanca所述,for in
遍历对象原型链中自己定义的属性。
要解决此问题,请使用hasOwnProperty()
。
for (var i in args) {
if (args.hasOwnProperty(i)) {
list.push(args[i]);
}
}