Heim > Web-Frontend > js-Tutorial > Hauptteil

Zusammenfassung der Mängel von Javascript für in

高洛峰
Freigeben: 2017-02-08 17:31:53
Original
1089 Leute haben es durchsucht

Zusammenfassung der Fehler in Javascript für in

Die for in-Anweisung wird verwendet, um die Attribute (Mitglieder) eines Objekts wie folgt aufzulisten

var obj = { name:"jack",
   getName:function(){return this.name}
};
//输出name,getName 
for(var atr in obj) {
  alert(atr);
}
Nach dem Login kopieren

Ist Ihnen aufgefallen, dass es keine Ausgabe von objs toString, valueOf und anderen integrierten Eigenschaften (oder integrierten Membern, versteckten Eigenschaften und vordefinierten Eigenschaften) gibt? Das heißt, for in wird verwendet, um die angezeigten Mitglieder (benutzerdefinierte Mitglieder) des Objekts aufzulisten.

Wenn die integrierten Attribute überschrieben werden, was wird ausgegeben, wenn wir objs toString umschreiben

var obj = {name:"jack",
   getName:function(){return this.name},
   toString:function(){return "I'm jack."}
}
for(var atr in obj) {
  alert(atr);
}
Nach dem Login kopieren

?

1. Unter IE6/7/8 ist es dasselbe, als würde man toString nicht umschreiben, immer noch nur den Namen getName ausgeben

2. Opera/Safari Die folgenden Ausgaben: name, getName, toString

Wenn Sie Attribute/Methoden zum integrierten Prototyp hinzufügen, ist dieser auch durchquerbar, wenn for in

Object.prototype.clone = function() {}
var obj = {
  name: 'jack',
  age: 33
}
// name, age, clone
for (var n in obj) {
  alert(n)
}
Nach dem Login kopieren

zu Object.prototype Methode clone hinzugefügt, 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, und letzteres hängt einfach alle Methoden unter Underscore.

Aber manchmal erweitern wir den Prototyp des integrierten Konstruktors auf Browsern, die ES5 nicht unterstützen (IE6/7/8). im Willen Es ist anders. Wie folgt

if (!Function.prototype.bind) {
  Function.prototype.bind = function(scope) {
    var fn = this
    return function () {
      fn.apply(scope, arguments)
    }
  }
}
function greet(name) {
  alert(this.greet + ', ' + name)
}
for (var n in greet) {
  alert(n)
}
Nach dem Login kopieren

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.

Um es zusammenzufassen: Beim browserübergreifenden Design können wir uns nicht darauf verlassen, dass for in die Mitgliedsnamen des Objekts erhält. Zur Beurteilung verwenden wir im Allgemeinen hasOwnProperty.

Vielen Dank fürs Lesen, ich hoffe, es kann Ihnen helfen, vielen Dank für Ihre Unterstützung dieser Website!

Weitere Artikel zur Fehlerzusammenfassung von Javascript für in finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage