2010-07-20 18 views
1

J'essaie de remplacer le window.alert pour passer plusieurs paramètres.Remplacer window.alert et passer plusieurs paramètres

Quelqu'un peut-il m'expliquer pourquoi for/in hérite du corps de Array.prototype.tester dans la liste?

Merci beaucoup.

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'); 

Répondre

0

Comme mentionné par casablanca, for in itère sur les propriétés définies par vous-même qui sont dans le prototype des objets chaîne.

Pour résoudre ce problème, utilisez hasOwnProperty().

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

window.alert est une fonction constante, vous ne pouvez pas redéfinissez directement:

Javascript overriding alert

+1

Ce lien dit que vous pouvez. –

+0

@loentar le lien dit que c'est possible en utilisant un proxy et non directement. – aledpardo

2

for-in itère sur toutes les propriétés énumérables d'un objet, qui comprend quoi que ce soit défini dans l'objet ou de ses prototypes. La plupart des fonctions intégrées sont déclarées non énumérables, de sorte qu'elles n'apparaissent pas lors de l'itération normale. ECMAScript 5 vous permet de définir vos propres propriétés comme non dénombrable, bien que je ne suis pas sûr que les navigateurs compatibles avec ceci:

function testerFunc() { 
    return 'tester'; 
} 

Object.defineProperty(Array.prototype, 'tester', { 
    value: testerFunc, 
    writable: true, 
    enumerable: false, 
    configurable: true 
});