Erstes Beispiel:
// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // prints both bar and moo }
Wir sollten hier auf zwei Punkte achten: Erstens ignoriert die for in-Schleife das aufzählbare Attribut, das auf false gesetzt ist. Zum Beispiel die Längeneigenschaft eines Arrays. Der zweite Grund ist, dass eine zu lange Prototypenkette die Leistung beeinträchtigt, da for in die gesamte Prototypenkette durchläuft.
Enumerable ist ein sehr unbekanntes Wort. Tatsächlich kann man seinen Schatten in JavaScript kaum finden und es wurde vom Autor tatsächlich von Ruby entlehnt. Der Zweck der Erstellung von Aufzählungen besteht nicht darin, sie unabhängig zu verwenden, sondern auf „gemischte“ Weise zu verwenden. Viele Methoden in Prototype verwenden Aufzählungen gemischt, sodass sie als Eckpfeiler des Prototyps bezeichnet werden können. Ich werde es hier nicht im Detail vorstellen. Weitere Informationen finden Sie unter - Enumerable.
Da wir das Verhalten der for in-Schleife selbst nicht ändern können, können wir nur andere Methoden verwenden, um Eigenschaften herauszufiltern, die nicht in der Schleife angezeigt werden sollen, und zwar über „Javascript Learning Notes – Objects (3): hasOwnProperty<.“ 🎜 >》Wir wissen, dass die hasOwnProperty-Methode dies tun kann.
Noch immer das vorherige Beispiel verwenden:
// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
Viele Frameworks entscheiden sich jetzt dafür, Methoden von Object.prototype zu erweitern. Wenn wir diese Frameworks verwenden, werden wir daher auf Probleme stoßen, wenn wir for-in-Schleifen verwenden, die nicht mit hasOwnProperty gefiltert werden.
Es wird empfohlen, eine gute Gewohnheit zum Filtern von Eigenschaften mit hasOwnProperty zu entwickeln. Machen Sie keine Annahmen über die laufende Umgebung und unabhängig davon, ob das native Prototypobjekt erweitert wird.