Does JavaScript ist in Schleife iterieren über Methoden?
-
23-09-2019 - |
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"]
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.