Prenons l'exemple en premier:
// empoisonnement objet.prototypeObject.prototype.bar = 1; var foo = {mooo: 2}; for (var i in foo) {console.log (i); // imprime à la fois la barre et le moo}Nous devons faire attention à deux points ici. La première est que la boucle FOR IN ignorera le jeu d'attribut à énumérable à false. Par exemple, la propriété de longueur d'un tableau. Deuxièmement, puisque pour In In Traverser toute la chaîne prototype, lorsque la chaîne prototype est trop longue, elle aura un impact sur les performances.
L'énumérable est un mot très étrange. En fait, il est difficile pour vous de trouver son ombre en JavaScript, et il est en fait emprunté à l'auteur de Ruby. Le but de créer un énumérable n'est pas de l'utiliser indépendamment, mais d'utiliser la méthode "mixte". De nombreuses méthodes dans le prototype utilisent des énumérables, il peut donc être considéré comme la pierre angulaire du prototype. Je ne donnerai pas une introduction détaillée ici, veuillez vous référer aux détails - ennumérables.
Étant donné que nous ne pouvons pas modifier le comportement de la boucle pour in dans, nous ne pouvons prendre que d'autres méthodes pour filtrer les propriétés qui ne veulent pas apparaître dans la boucle. Grâce à "JavaScript Learning Notes Objects (III): Hasownproperty", nous savons que la méthode HasownProperty peut le faire.
Filtre en utilisant Hasownproperty
Toujours en utilisant l'exemple précédent:
// empoisonnement objet.prototypeObject.prototype.bar = 1; var foo = {mooo: 2}; for (var i in foo) {if (foo.hasownproperty (i)) {console.log (i); }}C'est la seule façon correcte de l'écrire. Depuis que nous avons utilisé la méthode HasownProperty, nous n'avons sorti MOO que cette fois. Si la méthode HasownProperty n'est pas applicable, une erreur apparaîtra lorsque l'objet.prototype est étendu.
Maintenant, de nombreux frameworks choisissent d'étendre la méthode à partir de object.prototype, donc lorsque nous utilisons ces frameworks, nous rencontrerons des problèmes si nous utilisons un pour une boucle pour une boucle qui n'est pas filtrée avec HasownProperty.
Résumer
Il est recommandé de développer la bonne habitude des propriétés de filtrage de Hasownproperty, ne fait aucune hypothèse sur l'environnement de course, que l'objet prototype natif soit élargi.