Maison > Article > interface Web > Résumé des défauts de Javascript pour in
Résumé des défauts en Javascript pour in
L'instruction for in est utilisée pour lister les propriétés (membres) d'un objet, comme suit
var obj = { name:"jack", getName:function(){return this.name} }; //输出name,getName for(var atr in obj) { alert(atr); }
Avez-vous remarqué qu'il n'y a pas de sortie toString, valueOf et autres propriétés intégrées d'obj (ou membres intégrés, propriétés cachées et propriétés prédéfinies). Autrement dit, for in est utilisé pour répertorier les membres affichés (membres personnalisés) de l'objet.
Si les attributs intégrés sont remplacés, que sera le résultat si nous réécrivons les obj en toString
var obj = {name:"jack", getName:function(){return this.name}, toString:function(){return "I'm jack."} } for(var atr in obj) { alert(atr); }
?
1. Sous IE6/7/8, cela revient à ne pas réécrire toString, toujours uniquement le nom de sortie, getName
2. Opera/Safari Les sorties suivantes nom, getName, toString
Si vous ajoutez des attributs/méthodes au prototype intégré, il est également traversable quand pour dans
Object.prototype.clone = function() {} var obj = { name: 'jack', age: 33 } // name, age, clone for (var n in obj) { alert(n) }
à Object.prototype Ajout de la méthode clone, tous les navigateurs affichent le clone lorsqu'ils sont entrés.
Ce n'est peut-être pas grave, 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 pour le moment). dans la volonté, c'est différent. Comme indiqué ci-dessous
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) }
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 des objets. Nous utilisons généralement hasOwnProperty pour juger.
Merci d'avoir lu, j'espère que cela pourra vous aider, merci pour votre soutien à ce site !
Pour plus d'articles liés au résumé des défauts de Javascript pour, veuillez faire attention au site Web PHP chinois !