L'instruction for in est utilisée pour répertorier les propriétés (membres) d'un objet, comme suit
Copiez le code comme suit :
var obj = { nom : "jack",
getName:function(){return this.name}
} ;
//Nom de sortie,getName
pour (var atr dans obj) {
alerte(atr);
}
Avez-vous remarqué qu'il n'y a pas de propriétés intégrées (ou de membres intégrés, de propriétés cachées et de propriétés prédéfinies) telles que toString et valueOf d'obj. Autrement dit, for in est utilisé pour énumérer les membres affichés (membres personnalisés) de l'objet.
Si vous remplacez les propriétés intégrées, réécrivez le toString d'obj ci-dessous.
Copiez le code comme suit :
var obj = {nom:"jack",
getName:function(){return this.name},
toString:function(){return "Je suis Jack."}
}
pour (var atr dans obj) {
alerte(atr);
}
Quel sera le résultat ?
1. Sous IE6/7/8, c'est la même chose que sans réécrire toString, et ne génère toujours que name et getName.
2. Sous IE9/Firefox/Chrome/Opera/Safari, name, getName, toString est affiché
Si vous ajoutez des propriétés/méthodes au prototype intégré, il pourra également être parcouru pendant l'entrée
Copiez le code comme suit :
Objet.prototype.clone = fonction() {}
var obj = {
nom : 'jack',
âge: 33
}
// nom, âge, clone
pour (var n dans obj) {
alerte(n)
}
La méthode clone est ajoutée à Object.prototype et tous les navigateurs affichent clone lorsqu'ils sont entrés.
Cela n'a peut-être pas d'importance, car il n'est généralement pas recommandé d'étendre le prototype du constructeur intégré, ce qui est l'une des raisons du déclin de Prototype.js. jQuery et Underscore n'étendent pas l'auto-prototype. Le premier fait toute une histoire à propos de l'objet jQuery, tandis que le second bloque simplement toutes les méthodes sous le trait de soulignement.
Mais parfois, afin d'être compatible avec ES5 ou versions ultérieures, nous étendrons le prototype du constructeur intégré sur les navigateurs qui ne supportent pas ES5 (IE6/7/8. Dans ce cas, ce sera différent dans). chaque navigateur. comme suit
Copiez le code comme suit :
si (!Function.prototype.bind) {
Function.prototype.bind = fonction (portée) {
var fn = ceci
fonction de retour () {
fn.apply (portée, arguments)
}
}
}
fonction saluer (nom) {
alerte(this.greet + ', ' + nom)
}
pour (var n dans saluer) {
alerte(n)
}
Les sorties IE6/7/8 se lient, mais pas les autres navigateurs. Étant donné que bind est pris en charge de manière native dans les navigateurs modernes et que in n'est pas disponible, IE6/7/8 ajoute bind à Function.prototype.
Pour résumer : dans la conception multi-navigateurs, nous ne pouvons pas compter sur for in pour obtenir les noms de membres de l'objet. Nous utilisons généralement hasOwnProperty pour juger.