JeuWeb - Crée ton jeu par navigateur
[JS] Boucle for..in Array et ajout de methodes via prototype = conflit?! - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [JS] Boucle for..in Array et ajout de methodes via prototype = conflit?! (/showthread.php?tid=7068)

Pages : 1 2 3 4 5 6 7 8 9 10 11


[JS] Boucle for..in Array et ajout de methodes via prototype = conflit?! - Argorate - 29-07-2013

Bonjour,

j'aimerais ajouter une méthode sur la class JS Array (exemple: isEmpty()), donc j'ai ajouter :

Array.prototype.isEmpty()...

Ca marche très bien, sauf que ça m'a détraquer mon code, puisque maintenant l'instruction for(var i in myArray) boucle sur chaque membre du tableau + chaque fonctions ajoutées en prototype comme ci-dessus.

Une idée de comment ajouter une méthode à la classe sans casser la manière dont fonctionne le for..in?

merci


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - Maks - 29-07-2013

ES3


for (var index in arr) {
if (arr.hasOwnProperty(index)) {
indexes.push(index);
}
}

ES5

Object.defineProperty(Array.prototype, 'empty', {enumerable: false});



RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - Argorate - 29-07-2013

C'est quoi ES? Comment tu vois la version? ça dépend de celle du navigateur j'imagine?


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - Xenos - 29-07-2013

ECMAScript (la norme Javascript). Pour la version, oui, cela dépend de la version du navigateur, mais je n'ai pas de tableau de "conversion".


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - Argorate - 29-07-2013

ok, et si on en a plusieurs, faut se taper autant de lignes du genre:

Object.defineProperty(Array.prototype, 'func1', {enumerable: false});
Object.defineProperty(Array.prototype, 'func2', {enumerable: false});
Object.defineProperty(Array.prototype, 'funcn', {enumerable: false});

?


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - niahoo - 29-07-2013

on fait pas de for..in sur les array, on fait un for avec la length


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - Maks - 29-07-2013

beurk


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - niahoo - 29-07-2013

pourquoi beurk ? Certains navigateurs merdiques te font passer des propriétés à la con dans ta boucle for sinon. Et vérifier si chaque clé est une "ownproperty" c'est une perte de temps. Donc, si on est pas fichu de faire une map avec une callback, vaut mieux utiliser la length je dirais. ça se la pète moins mais c'est simple et efficace.


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - Maks - 29-07-2013

je voulais dire c'est moche quoi, ça fait très java
après c'est vrai que vérifier hasOwnProperty à chaque fois est chiant et surchage le code (coffeescript propose "for own" pour palier), la solution de rendre non énumérable me parait acceptable (ça dépend quels navigateurs on vise encore une fois)
sinon le mieux imo c'est array.forEach() ouais, ça fait plus "objet" (merci de ne pas ressortir les benchmarks pour me contredire, c'est débattu et débattu ^^)


RE: [JS]Boucle for..in Array et ajout de methodes via prototype = conflit?! - Xenos - 29-07-2013

Citation :The for in loop iterates over all the keys in the object's prototype chain, including the indexOf method you added.
[...]
for .. in is meant for looping through object properties, definitely not arrays.
[...]
A for...in loop does not iterate over built-in properties. ... However, the loop will iterate over all user-defined properties (including any which overwrite built-in properties).

Sauce (ou Source, mais l'erreur de typo initiale est sympa: je la laisse!)

J'ai peur de le ressortir du coup...
For & length aura d'ailleurs plus de patate que for-in.

J'irai plutôt dans le sens de la composition au lieu de l'héritage: On ne touche pas à array et on crée une nouvelle "classe", type "ArrayList" ou autre nom qu'on aime bien, pour laquelle on a la propriété "datas", un array classique, et toutes les méthodes statiques ou non que l'on souhaite. Rien de plus simple alors que d'avoir du forEach, du isEmpty, ou autres méthodes persos, attachées à cette classe. Non?