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 100
    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 100
    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