[Javascript] Tableau de fonctions et Array.prototype

Tableau de fonctions et Array.prototype [Javascript] - HTML/CSS - Programmation

Marsh Posté le 19-09-2010 à 06:12:10    

Bonjour,
 
Voila il y a un truc que je ne comprend pas en javascript:
 

<html>
<head></head>
<body>
 <script>
  Array.prototype.lol = function() {
   alert('lol');
  };
   
  var functions = [];
  functions.push(function() { });
  functions.push(function() { });
   
  for(var i in functions) {
   functions[i]();
  }
 </script>
</body>
</html>


Pourquoi dans ce code le alert('lol') s'affiche alors que la fonction 'lol' n'est jamais appeler ?
Je me contente de faire un tableau de fonctions puis de les appeler alors pourquoi cette fichu fonction 'lol' est appeler ?
 
Le problème est identique sur Chrome et Firefox.
 
Merci d'avance pour votre aide ^^


Message édité par SMGbab16 le 19-09-2010 à 06:24:12
Reply

Marsh Posté le 19-09-2010 à 06:12:10   

Reply

Marsh Posté le 19-09-2010 à 10:16:32    

Bah tu est encore resté bloqué au PHP je crois.
 
Un tableau c'est un objet indexé pour simplifier.
Donc pour parcourir un tableau on le parcours avec un index  
[code]
for (var i=0; i<functions.length; i++) {
   functions[i]();
}
[code]
 
En utilisant for in, tu parcours le tableau comme un objet, donc tu parcours toutes ses propriétés, du coup tu vas même exécuter les méthodes du prototype dont map, filter, sort, etc, et pire encore, tu exécute des propriétés comme si c'était des fonctions
tableau.length().
 
Pour bien comprendre, tu installes firebug, tu ouvres la console, et tut regardes toutes les erreurs que ton code va générer.
 


---------------
Blablaté par Harko
Reply

Marsh Posté le 20-09-2010 à 08:59:26    

Effectivement je pensais que le for..in était l'équivalent du foreach.
 
Mais le problème était un peu plus vicieux que ce que tu laisse entendre car ça n’exécutais que les méthodes que j'ajoutais moi même au prototype et pas les méthodes ou propriétés natives.
 
Entre temps j'ai fait quelques recherches et je suis tomber sur ca: https://developer.mozilla.org/en/Ja [...] wnProperty
"unlike the in operator, this method does not check down the object's prototype chain."
 
Ça peut être utile pour itérer sur un Object (qui sert comme tableau associatif ou map)
Car pour itérer sur un Object on utilise bien for..in cette fois et on retrouve le même problème si on a ajouter des méthodes a Object.prototype
 
En tout cas merci pour ton aide ^^

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed