Heim  >  Artikel  >  Web-Frontend  >  Zusammenfassung der Mängel von Javascript für in

Zusammenfassung der Mängel von Javascript für in

高洛峰
高洛峰Original
2017-02-08 17:31:531049Durchsuche

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);
}

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);
}

?

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)
}

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)
}

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!

Stellungnahme:
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