覆盖window.alert并传递多个参数

时间:2010-07-20 06:05:58

标签: javascript parameters window alert

我试图覆盖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');

3 个答案:

答案 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是一个常量函数,你不能直接重新定义它:

Javascript overriding alert

答案 2 :(得分:0)

casablanca所述,for in遍历对象原型链中自己定义的属性。

要解决此问题,请使用hasOwnProperty()

for (var i in args) {
    if (args.hasOwnProperty(i)) {
        list.push(args[i]);
    }
}