Переопределение window.alert и передача нескольких параметров - PullRequest
1 голос
/ 20 июля 2010

Я пытаюсь переопределить 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 ]

2 голосов
/ 20 июля 2010

for-in перебирает все перечисляемые свойства объекта, включая все, что определено в объекте или его прототипах. Большинство встроенных функций объявлены не перечисляемыми, поэтому они не появляются во время обычной итерации. ECMAScript 5 позволяет вам определять свои собственные свойства как не перечисляемые, хотя я не уверен, какие браузеры поддерживают это:

function testerFunc() {
  return 'tester';
}

Object.defineProperty(Array.prototype, 'tester', {
  value: testerFunc,
  writable: true,
  enumerable: false,
  configurable: true
});
0 голосов
/ 20 июля 2010

Как уже упоминалось casablanca , for in перебирает свойства, определенные вами, которые находятся в цепочке прототипов объектов.

Чтобы исправить это, используйте hasOwnProperty().

for (var i in args) {
    if (args.hasOwnProperty(i)) {
        list.push(args[i]);
    }
}
0 голосов
/ 20 июля 2010

window.alert - постоянная функция, ее нельзя переопределить напрямую:

Предупреждение о переопределении JavaScript

...