Premier exemple :
// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // prints both bar and moo }
Nous devons prêter attention à deux points ici. Premièrement, la boucle for in ignorera l'attribut énumérable défini sur false. Par exemple, la propriété length d'un tableau. La seconde est que, comme for in traversera toute la chaîne de prototypes, lorsque la chaîne de prototypes est trop longue, cela affectera les performances.
Enumerable est un mot très inconnu en fait, on peut difficilement trouver son ombre en JavaScript, et il est en fait emprunté par l'auteur à Ruby. Le but de la création d'un énumérable n'est pas de l'utiliser indépendamment, mais de l'utiliser de manière "mixte". De nombreuses méthodes dans Prototype utilisent l'énumérable de manière mixte, on peut donc dire qu'il s'agit de la pierre angulaire du prototype. Je ne le présenterai pas en détail ici. Pour plus de détails, veuillez vous référer à - Enumerable.
Puisque nous ne pouvons pas modifier le comportement de la boucle for in elle-même, nous ne pouvons utiliser que d'autres méthodes pour filtrer les propriétés que nous ne souhaitons pas voir apparaître dans la boucle. Via "Javascript Learning Notes - Objects (3) : hasOwnProperty<. 🎜 >》Nous savons que la méthode hasOwnProperty peut faire cela.
Toujours en utilisant l'exemple précédent :
// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
De nombreux frameworks choisissent désormais d'étendre les méthodes d'Object.prototype, donc lorsque nous utiliserons ces frameworks, nous rencontrerons des problèmes si nous utilisons des boucles for in qui ne sont pas filtrées avec hasOwnProperty.
Il est recommandé de développer une bonne habitude de filtrer les propriétés avec hasOwnProperty. Ne faites aucune hypothèse sur l'environnement d'exécution, et que l'objet prototype natif soit étendu ou non.