Question

Dans un article sur yuiblog Douglas Crockford dit que la déclaration de for in itérera sur les méthodes d'un objet. Pourquoi le code suivant pas produit [ "a", "b", "c", "d", "toString"]? Ne sont pas .toString () et d'autres membres de méthodes de my_obj?

Object.prototype.toString = function(){return 'abc'}
Object.prototype.d = 4;

my_obj = {
    'a':1,
    'b':2,
    'c':3
}

a = []
for (var key in my_obj) {
    a.push(key)
}

console.log(a) // prints ["a", "b", "c", "d"]
Était-ce utile?

La solution

Toutes les propriétés définies par l'utilisateur sont dénombrable, y compris les propriétés héritées de prototype. Les propriétés natives intégrées ne sont pas. toString() est l'un d'entre eux. Voir ici https://developer.mozilla.org/En/Core_JavaScript_1 .5_Reference / Déclarations / Pour ...

Modifier : Mon interprétation de « Cependant, la boucle itérer sur toutes les propriétés définies par l'utilisateur (y compris tout ce qui écrasent des propriétés intégrées) » est que les propriétés qui sont directement écrasés dans l'objet se dénombrable. Pas le Ecraser dans le prototype lui-même. Cela signifie:

var my_obj = {a: 1, b: 2, c: 3};
my_obj.toString = function() {return 'abc';};

a = []
for (var key in my_obj) {
    a.push(key)
}

console.log(a) // prints ["a", "b", "c", "toString"]

Autres conseils

for..in itère sur les propriétés définies par l'utilisateur. Si vous modifiez votre code:

Object.prototype.foo = function() { return 'abc'; };

Ensuite

console.log(a);

Affichera:

["a", "b", "c", "foo", "d"]

Chetan Sastry a pointé out, toString est traitée différemment car il est, propriété native intégrée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top