Javascript: cacher prototype méthodes pour la boucle?
Donc disons que j'ai ajouté quelques prototypes de méthodes de la classe Array:
Array.prototype.containsKey = function(obj) {
for(var key in this)
if (key == obj) return true;
return false;
}
Array.prototype.containsValue = function(obj) {
for(var key in this)
if (this[key] == obj) return true;
return false;
}
puis-je créer un tableau associatif et tenter de boucle par le biais de touches:
var arr = new Array();
arr['One'] = 1;
arr['Two'] = 2;
arr['Three'] = 3;
for(var key in arr)
alert(key);
cela renvoie cinq éléments:
-Un -Deux -Trois -containsKey -containsValue
mais je veux attendre?) seulement trois. Suis-je en approchant de ce mal? est-il un moyen de "cacher" le prototype des méthodes? ou devrais-je faire quelque chose différemment?
- Voir aussi cette réponse
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser du JavaScript hasOwnProperty méthode pour atteindre cet objectif dans la boucle, comme ceci:
Référence: Ce YUI article du blog.
Object.prototype.has = Object.prototype.hasOwnProperty
Vous pouvez atteindre les résultats souhaités à partir de l'autre extrémité en faisant le prototype des méthodes non énumérable:
Généralement cela fonctionne mieux si vous avez le contrôle sur les définitions de méthode, et en particulier si vous n'avez aucun contrôle sur la façon dont votre code sera appelé par d'autres personnes, ce qui est une hypothèse commune dans la bibliothèque de l'élaboration du code.
add
la fonction github.com/jquery/jquery/blob/1.12-stable/src/serialize.js#L58 fonctionne juste à ceux des méthodes à l'aveuglette, et il provoqueUncaught TypeError: Cannot read property of undefined
, Cette solution est également très élégant!Javascript ne prend pas en charge les tableaux associatifs de la façon dont vous pensez qu'ils font. http://ajaxian.com/archives/javascript-associative-arrays-considered-harmful
for (var i in .. obtient toutes les propriétés d'un objet (un tableau est simplement un autre objet), qui est pourquoi vous voyez les autres objets que vous avez prototypée pour elle.
Que l'article suggère que vous devriez utiliser un objet:
vous pourriez faire ceci:
Mais c'est une pacotille solution de contournement
Méthode 1: utilisation Objet.touches (qui ne retourne pas les propriétés du prototype) & boucle
Méthode 2: hasOwnProperty à l'intérieur d'une boucle for.
Pour la haute performance de l'itération sur les tableaux JavaScript, utilisez soit un
for
ouwhile
boucle. Nicolas Zakas discute le plus performant des options pour parcourir des tableaux dans sa Parler de Technologie La Vitesse De Votre JavaScript.Votre meilleur pari est probablement quelque chose comme ceci:
Cette approche sera d'effectuer le meilleur pour plusieurs raisons:
length
propriété n'est accessible qu'une fois, lors de l'initialisation de la bouclei >= 0
) au lieu d'une autre variable