Я пытаюсь переопределить window.alert для передачи нескольких параметров.
Кто-то объясняет меня, почему для/в наследовал тело 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');
Как упоминалось в casablanca , for in
выполняет итерацию по свойствам, определенным вами, которые находятся в цепочке прототипов объектов.
Чтобы исправить это, используйте hasOwnProperty ()
.
for (var i in args) {
if (args.hasOwnProperty(i)) {
list.push(args[i]);
}
}
window.alert
- это константная функция, вы не можете переопределить ее напрямую:
for-in
выполняет итерацию по всем перечислимым свойствам объекта, которая включает все, что определено в объекте или его прототипах. Большинство встроенных функций объявлены неперечислимыми, поэтому они не появляются во время обычной итерации. ECMAScript 5 позволяет определять собственные свойства как неперечислимые, хотя я не уверен, какие браузеры это поддерживают:
function testerFunc() {
return 'tester';
}
Object.defineProperty(Array.prototype, 'tester', {
value: testerFunc,
writable: true,
enumerable: false,
configurable: true
});