IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Programmation objet classique en Javascript


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut Programmation objet classique en Javascript
    Bonjour,

    Je rencontre souvent le même problème en javascript :
    Je créer des objets comportant des méthodes appelées par événement. Sauf que dans ces méthode, je ne peux plus accéder à mes variables de classe.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    var MarqueurOH = function(params_id, params_data)
    {
    	//Initialisation de l'objet :
    	MarqueurOH.initialized = false;
     
    	//Initialisation des fonctions :
    	function toggleInfoWindow(event)
    	{
    		//Impossible d'aceder à cette variable :
    		this.marqueur !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	}
     
    	//Initialisation des variables de classe :
    	this.id = id;
    	this.data = data;
    	this.marqueur = new google.maps.Marker({});
     
    	//event :
    	google.maps.event.addListener(marqueur, 'click', toggleInfoWindow);
     
    	//L'objet est initialisé, les fonctions ne seront pas recréées pour chaque instances :
    	MarqueurOH.initialized = true; 
    }
    J'ai donc cherché et trouvé ce tutoriel que je n'ai pas encore lu :
    http://t-templier.developpez.com/tut...vascript-poo3/
    http://t-templier.developpez.com/tut...vascript-poo2/
    http://t-templier.developpez.com/tut...vascript-poo1/

    Croyez vous qu'il résolve mes problèmes ?
    Existe il une librairie qui permette de créer des objets fonctionnel même dans les cas d'appel de fonction événement ? Je crois qu'en créant un plugin jquery, je résoudrai mes problèmes, mais bon je ne veux pas forcement que l'objet soit associé à un élément du dom...


    Merci d'avance

  2. #2
    Membre éclairé
    Avatar de Darkyl
    Homme Profil pro
    autodidacte en recherche d'emploi
    Inscrit en
    Novembre 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : autodidacte en recherche d'emploi

    Informations forums :
    Inscription : Novembre 2004
    Messages : 440
    Billets dans le blog
    1
    Par défaut
    Salut

    Alors, je veux pas dire de connerie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function toggleInfoWindow(event)
    	{
    		//Impossible d'aceder à cette variable :
    		this.marqueur !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	}
    this.marqueur désignerait toggleInfoWindow.marqueur si je ne m'abuse (et si cela existait) mais il te faut accéder au parent, du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function toggleInfoWindow(event)
    	{
    		
    		parent.marqueur 
    	}
    Mais je ne connais pas le mot clef exact, je vais cherchais...

    Bon d'accord, je t'ai pas beaucoup aider là mais sait on jamais, peut-être que ma logique est bonne et qu'un forumeur va expliciter...

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    C'est l'idée, mais malheureusement ce n'est pas possible en javascript.
    A moins de simuler cet aspect "programmation objet pure" en lisant le tuto. Mais en fait je me demandais surtout, est ce que ce tuto résout exactement ce dont je cherche à faire, c'est à dire accéder à un objet membre dans une fonction evenement !?

  4. #4
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Le problème vient du fait que tu passes ta fonction "toggleInfoWindow" à un event et elle sera donc appelée de façon isolée sans l'objet sur lequel elle devrait être appelée :

    un peu comme :
    MarqueurOH.toggleInfoWindow(); // this == toggleInfoWindow
    var f = MarqueurOH.toggleInfoWindow;
    f(); // this == window (puisque non spécifié -> aucun point (.) devant la fonction

    Une des 2 solutions vient donc à encapsuler l'objet dans une closure (les librairies utilisent en général une fonction "bind" pour faire ça il me semble) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	//event :
    	google.maps.event.addListener(marqueur, 'click',function(){ MarqueurOH.toggleInfoWindow(); });
    l'autre solution, c'est de stocker une référence au "this" dans la définition de l'objet, ainsi dans les fonctions (déclarée dans ce contexte) pourront y accéder même si leurs "this" valent autre chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var MarqueurOH = function(params_id, params_data)
    {
    	//Sauvegarde de l'objet :
    	var that = this;
     
    	//Initialisation de l'objet :
    	MarqueurOH.initialized = false;
     
    	//Initialisation des fonctions :
    	function toggleInfoWindow(event)
    	{
    		//récupération de l'objet principale via une référence.
    		that.marqueur !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	}
     //....
    }

  5. #5
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    +1 pour Will : le plus simple est de sauvegarder le contexte.

    jQuery et Prototype, entre autres, proposent des méthodes pour conserver le contexte lorsqu'on attache un évènement, mais je n'ai pas l'impression que l'API Google Maps ait quelque chose dans ce goût-là. Dans la doc, il est conseillé d'utiliser les closures, ce qui rejoint la remarque de Will. Après, je ne connais pas vraiment cette API, donc peut-être que je me trompe...

    Edit: lorsqu'un gestionnaire d'évènement est déclenché, this désigne l'élément DOM sur lequel ce gestionnaire a été attaché. Dans le cas présent, il semblerait que ce soit le marqueur en question. Si c'est vrai, ça nous simplifie la vie
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par Soap17 Voir le message
    Bonjour,

    Je rencontre souvent le même problème en javascript :
    Je créer des objets comportant des méthodes appelées par événement. Sauf que dans ces méthode, je ne peux plus accéder à mes variables de classe.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    var MarqueurOH = function(params_id, params_data)
    {
    	//Initialisation de l'objet :
    	MarqueurOH.initialized = false;
     
    	//Initialisation des fonctions :
    	function toggleInfoWindow(event)
    	{
    		//Impossible d'aceder à cette variable :
    		this.marqueur !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    	}
     
    	//Initialisation des variables de classe :
    	this.id = id;
    	this.data = data;
    	this.marqueur = new google.maps.Marker({});
     
    	//event :
    	google.maps.event.addListener(marqueur, 'click', toggleInfoWindow);
     
    	//L'objet est initialisé, les fonctions ne seront pas recréées pour chaque instances :
    	MarqueurOH.initialized = true; 
    }
    J'ai donc cherché et trouvé ce tutoriel que je n'ai pas encore lu :
    http://t-templier.developpez.com/tut...vascript-poo3/
    http://t-templier.developpez.com/tut...vascript-poo2/
    http://t-templier.developpez.com/tut...vascript-poo1/

    Croyez vous qu'il résolve mes problèmes ?
    Existe il une librairie qui permette de créer des objets fonctionnel même dans les cas d'appel de fonction événement ? Je crois qu'en créant un plugin jquery, je résoudrai mes problèmes, mais bon je ne veux pas forcement que l'objet soit associé à un élément du dom...


    Merci d'avance
    encore une fois javascript n'est pas un langage à base de classe mais de prototype.

    enfin tout comme dans les langages à base de classe this s'applique à l'objet courant et non pas à un quelconque truc définit on ne sais où.

    lorsqu'on passe à un listener une référence à une fonction (javascript emploi à bon escient le mot fonction là ou java et C++ en abuse et devrait utilise rméthode) il passe la fonction et que la fonction
    celle-ci s'appliquera donc à l'objet this activé par le listener

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    monObj = {
       foo: function() {
          this.a = 45;
       },
       a: 105
    }
     
    bouton = document.getElementById('btn')
    bouton.onclick=monObj.foo;
    console.log(monObj.a); // => 105
    console.log(bouton.a); // => undefined
     
    //click sur le bouton btn
    console.log(monObj.a); // => 105
    console.log(bouton.a); // => 45

    On n'a passé qu'une référence à foo et non pas l'objet monObj

    appeler monObj.foo() dans la le listeneur du bouton il faut faire

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    monObj = {
       foo: function() {
          this.a = 45;
       },
       a: 105
    }
     
    bouton = document.getElementById('btn')
    bouton.onclick= function () {monObj.foo();};
    console.log(monObj.a); // => 105
    console.log(bouton..a); // => undefined
     
    //click sur le bouton btn
    console.log(monObj.a); // => 45
    console.log(bouton.a); // => undefined

    ou encore
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    monObjConstructor = function () {
       this.foo= function() {
          this.a = 45;
       };
       this.a= 105;
       var me = this;
       document.getElementById('btn').onclick= function () {
          me.foo();
       };
    }
     
    monObj = new monObjConstructor ();
    console.log(monObj.a); // => 105
    console.log(bouton..a); // => undefined
     
    //click sur le bouton btn
    console.log(monObj.a); // => 45
    console.log(bouton.a); // => undefined

    A+JYT

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 49
    Par défaut
    Merci à tous pour votre aide.
    Le "var me = this;" me plait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/06/2014, 20h20
  2. Programmation objet javascript
    Par BSans dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2009, 18h29
  3. [POO] Changer la source d'un objet (flash) en Javascript
    Par thomine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/02/2008, 16h54
  4. Problème programmation objet
    Par Contrec dans le forum MFC
    Réponses: 54
    Dernier message: 30/03/2005, 11h30
  5. [POO] Rendre invisible un objet Flash en Javascript
    Par tafkap dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/10/2004, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo