Nehmen wir zuerst das Beispiel:
// Objekt vergiften. // druckt sowohl Bar als auch MOO}
Wir müssen hier auf zwei Punkte achten. Eine davon ist, dass die für in Schleifen das auf aufzählbare zu zählende Attribut ignoriert wird. Zum Beispiel die Länge Eigenschaft eines Arrays. Zweitens, da in IN die gesamte Prototyp -Kette durchquert, wird sie sich auf die Leistung auswirken, wenn die Prototypkette zu lang ist.
Aufzählbar ist ein sehr seltsames Wort. Tatsächlich fällt es Ihnen schwierig, seinen Schatten in JavaScript zu finden, und es wird tatsächlich vom Autor von Ruby ausgeliehen. Der Zweck der Erstellung eines Aufzählung ist nicht, es unabhängig zu verwenden, sondern die "gemischte" Methode zu verwenden. Viele Methoden im Prototyp verwenden aufzählbar, sodass es als Eckpfeiler des Prototyps ist. Ich werde hier keine detaillierte Einführung geben. Weitere Informationen finden Sie in den Details - Aufzählbar.
Da wir das Verhalten der für in der Schleife selbst nicht ändern können, können wir nur andere Methoden mitnehmen, um Eigenschaften herauszufiltern, die nicht in der Schleife erscheinen wollen. Durch "JavaScript Learning Notes Objects (III): HasownProperty" wissen wir, dass die HasownProperty -Methode dies tun kann.
Filter mit HasownProperty
Verwenden Sie immer noch das vorherige Beispiel:
// Objekt vergiften. für (var i in foo) {if (foo.hasownProperty (i)) {console.log (i); }}Dies ist der einzig korrekte Weg, um es zu schreiben. Da wir die HasownProperty -Methode verwendet haben, geben wir diesmal nur MOO aus. Wenn die Methode des HasownProperty nicht anwendbar ist, wird ein Fehler angezeigt, wenn das Objekt.Prototyp erweitert wird.
Jetzt entscheiden sich viele Frameworks dafür, die Methode von Object.Prototype zu erweitern. Wenn wir diese Frameworks verwenden, werden wir auf Probleme stoßen, wenn wir eine für in Schleifen verwenden, die nicht mit HasownProperty gefiltert wird.
Zusammenfassen
Es wird empfohlen, die gute Angewohnheit von HasownProperty -Filtereigenschaften zu entwickeln und keine Annahmen über die laufende Umgebung zu treffen, unabhängig davon, ob das native Prototyp -Objekt erweitert wird.