methusalah / optics

An optical simulator in browser
1 stars 1 forks source link

persistance d'un objet #6

Open methusalah opened 9 years ago

methusalah commented 9 years ago

j'ai fait ce code : Model = function(){ this.pool = []; this.pool.push(new Point2D(5, 7)); this.pool.push(new Point2D(10, 15)); this.pool.push(new Point2D(23, 15)); } Model.tick = function(){ console.info(this.pool); };

dans le onload() : Model(); while(true) Model.tick();

Mon problème est que l'appel à Model.tick écrit undefined dans la console et je ne comprend pas bien pourquoi. Model n'est-il pas un objet à part entière dans lequel j'ai le loisir d'ajouter ma méthode tick()? Les mentions "this" ne pointent-elles pas vers le tableau pool défini dans la méthode de construction de mon objet? si oui pourquoi n'est-il pas consistant?

J'ai du mal à placer mes commentaires de débug, car je ne comprend pas encore bien comment ça se passe.

Merci !

solendil commented 9 years ago

Model est une fonction dont l'exécution crée un contexte this. Ta fonction tick est ajoutée non pas à une instance (et donc un contexte this) mais à la fonction Model elle-même. Donc dans la fonction tick, le mot clef this est undefined. Dans la même veine, lorsque tu fais Model() tu instanties un objet, mais tu n'assignes pas l'instance, qui est donc perdue.

Voici le code fonctionnel : tick est définie dans le contexte de l'instance, l'instantiation est assignée à une variable m sur laquelle tick est appelée.

Model = function(){
  this.pool = [];
  this.pool.push(1); // bla
  this.tick = function(){
    console.info(this.pool);
  };
}

m=new Model();
m.tick();

Nota: pourquoi le JS te laisse-t-il ajouter tick à Model si ça n'a pas de sens? Parce que en JS, les fonctions sont des first-class objects, donc les fonctions sont des objets, et tous les objets JS sont ouverts (on peut y ajouter des choses), donc on peut ajouter une fonction à une fonction, même si ça n'a aucun sens :)

Nota 2: renonce à faire de l'objet en JS, renoooooonce :)

methusalah commented 9 years ago

Okay je pense que j'ai compris.

J'ai pas mal lu d'articles et j'ai crut comprendre que beaucoup de codeurs sont dans mon cas. Le paradigme objet est tellement omniprésent dans mon approche que j'ai énormément de mal à m'en défaire. Du coup, j'adapte Javascript à ma façon de coder, alors qu'il vaudrait sûrement mieux faire l'inverse.

Cela dit, C'est aussi une force de Javascript que de pouvoir accueillir et concilier des approches si différentes les unes des autres. Au début j'avais le sentiment que tout ça tenait avec des bouts de ficelle, que le langage avait produit mille artifices pour faire croire qu'il savait tout faire. Mais je réalise petit à petit que sa logique de base est ultra souple et permissive, et que les différentes communautés de codeurs en ont fait des adaptations très variés.

C'est d'ailleurs perturbant car entre tes conseils et tout ceux que je lit par ailleurs, je ne sais pas trop quel chemin emprunter. Pas facile de quitter sa zone de confort. Pour le moment je choisit donc de ne pas trop me faire violence : je modèle Javascript selon mon besoin et mes habitudes. Et ça marche.

Je remarque souvent que j'emploi des nouvelles méthodes, qui seraient apparut en rouge clignotant sous Eclipse. Je trouve agréable de pouvoir créer du code "non POO" pour mettre en production un premier essai. Avec Java, c’était souvent frustrant de devoir mettre en place tout une structure pour expérimenter un algo, en sachant qu'il faudrait entièrement la refaire plus tard.

Du coup, je crois que c'est comme ça que je pense apprendre le Javascript. C'est peut être pas la bonne façon, si tant est qu'il y en est une. Et j’espère que ça ne t’exaspère pas trop ^^ mais pour le moment ça me plait !

Bisous et merci pour tes réponses !