Frage

In einem Artikel auf yuiblog Douglas Crockford sagt, dass die for in Anweisung, um die Methoden eines Objekts durchlaufen wird. Warum produziert der folgende Code nicht [ "a", "b", "c", "d", "toString"]? Sind nicht .ToString () und andere Methoden Mitglieder 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"]
War es hilfreich?

Lösung

Alle benutzerdefinierten Eigenschaften sind zählbare, einschließlich der Eigenschaften von Prototypen geerbt. Der eingebaute in nativen Eigenschaften sind es nicht. toString() ist einer von ihnen. Sehen Sie hier https://developer.mozilla.org/En/Core_JavaScript_1 .5_Reference / Statements / For ... in

Bearbeiten : Meine Interpretation von „Allerdings wird die Schleife durchläuft alle benutzerdefinierten Eigenschaften (einschließlich aller, die Einbau-Überschreiben Eigenschaften)“ ist, dass die Eigenschaften , die direkt im Objekt werden enumerable überschrieben. Nicht das Überschreiben im Prototyp selbst. Das bedeutet:

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"]

Andere Tipps

for..in iteriert benutzerdefinierte Eigenschaften. Wenn Sie Ihren Code ändern:

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

Dann

console.log(a);

Will Ausgabe:

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

Wie Chetan Sastry spitze spitze out wird toString anders behandelt, da es eine eingebaute, nativen Eigenschaft ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top