Maison  >  Article  >  interface Web  >  Résumé des défauts de Javascript pour in

Résumé des défauts de Javascript pour in

高洛峰
高洛峰original
2017-02-08 17:31:531090parcourir

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 !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn