Die for in-Anweisung wird wie folgt verwendet, um die Eigenschaften (Mitglieder) eines Objekts aufzulisten
Kopieren Sie den Codecode wie folgt:
var obj = { name:"jack",
getName:function(){return this.name}
};
//Ausgabename,getName
for(var atr in obj) {
alarm(atr);
}
Ist Ihnen aufgefallen, dass es keine integrierten Eigenschaften (oder integrierte Mitglieder, versteckte Eigenschaften und vordefinierte Eigenschaften) wie toString und valueOf von obj gibt? Das heißt, for in wird verwendet, um die angezeigten Mitglieder (benutzerdefinierten Mitglieder) des Objekts aufzuzählen.
Wenn Sie die integrierten Eigenschaften überschreiben, schreiben Sie den toString von obj unten neu.
Kopieren Sie den Codecode wie folgt:
var obj = {name:"jack",
getName:function(){return this.name},
toString:function(){return „Ich bin Jack.“}
}
for(var atr in obj) {
alarm(atr);
}
Was wird ausgegeben?
1. Unter IE6/7/8 ist es dasselbe wie ohne Umschreiben von toString und gibt immer noch nur name und getName aus.
2. Unter IE9/Firefox/Chrome/Opera/Safari wird name, getName, toString ausgegeben
Wenn Sie dem integrierten Prototyp Eigenschaften/Methoden hinzufügen, ist dieser auch während for in durchquerbar
Kopieren Sie den Codecode wie folgt:
Object.prototype.clone = function() {}
var obj = {
Name: 'Jack',
Alter: 33
}
// Name, Alter, Klon
for (var n in obj) {
Warnung(n)
}
Die Methode clone wird zu Object.prototype hinzugefügt und alle Browser zeigen clone an, wenn für in.
Dies spielt möglicherweise keine Rolle, da es im Allgemeinen nicht empfohlen wird, den Prototyp des integrierten Konstruktors zu erweitern, was einer der Gründe für den Niedergang von Prototype.js ist. jQuery und Underscore erweitern den Selbstprototyp nicht. Ersteres macht viel Aufhebens um das jQuery-Objekt, während letzteres einfach alle Methoden unter Underscore hängt.
Aber manchmal erweitern wir den Prototyp des integrierten Konstruktors auf Browsern, die ES5 (IE6/7/8) nicht unterstützen, um mit ES5 oder nachfolgenden Versionen kompatibel zu sein Jeder Browser. wie folgt
Kopieren Sie den Codecode wie folgt:
if (!Function.prototype.bind) {
Function.prototype.bind = function(scope) {
var fn = dies
Rückgabefunktion () {
fn.apply(Umfang, Argumente)
}
}
}
Funktion Greet(Name) {
Alert(this.greet + ', ' + Name)
}
for (var n in grüße) {
Warnung(n)
}
IE6/7/8-Ausgaben werden gebunden, andere Browser jedoch nicht. Da bind in modernen Browsern nativ unterstützt wird und for in nicht verfügbar ist, fügt IE6/7/8 bind zu Function.prototype hinzu.
Zusammenfassend: Beim browserübergreifenden Design können wir uns nicht darauf verlassen, dass for in die Mitgliedsnamen des Objekts erhält. Wir verwenden im Allgemeinen hasOwnProperty zur Beurteilung.