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 :

[POO] Modèle objet: this inutilisable dans certains cas?


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 22
    Points
    22
    Par défaut [POO] Modèle objet: this inutilisable dans certains cas?
    Tout d'abord bonjour à tous je viens de m'inscrire sur le forum.

    Lorsque je défini mon propre objet l'utilisation de this devient inutile dans certains cas comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function monObjet()
    {
          this.faireUnTruc=function monObjet_faireUnTruc()
          {
                ...
          }
     
          this.delai=function monObjet_delai()
          {
               setTimout(this.faireUnTruc,500);<-------------- là
          }
    }
    J'aimerai donc lancer l'execution de ma methode de l'objet nommée faireUnTruc à retardement.
    Mais voilà ici setTimeout() attend du code et donc une chaine.
    La solution serait de récupérer le nom de la variable de mon objet instancié et d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setTimeout(nomInstance+'.faireUnTruc')
    Mais voilà je suis encore à l'interieur de ma classe, y'a t-il un moyen de récupérer le nom de la variable contenant l'instance autrement qu'en la passant en chaine en paramètres au moment de la construction de l'objet comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet1=new monObjet('monObjet1');
    C'est pas très élégant...

    Si quelqu'un à une alternative je suis preneur, merci!

  2. #2
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    On a déjà eut une question de ce genre y'a pas très longtemps.

    Ton setTimout(this.faireUnTruc,500); fait une copie de ta FONCTION faireUnTruc car this.faireUnTruc est une fonction (il n'y a que le fait qu'elle soit contenu dans une propriété d'un objet qui fait une méthode).

    Avec setTimeout la solution est simple : setTimout(function (myThis) { myThis.faireUnTruc(); }, 500, this);
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 185
    Points
    185
    Par défaut
    Celelibi > la fonction setimeout avec plus de 2 argument est uniquement compatible avec les moteurs gecko (FF, Moz)

  4. #4
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Je suis étonné de ta syntaxe à 3 arguments Celibri et j'avoue ne pas trouver de référence à cette syntaxe, même dans la documentation du moteur Gecko....

    Quand à la solution au problème de base, je pense qu'il faut passer par une fonction avec passage d'argument.

    Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function doFaireUnTruc(objet) {
      return objet.faireUnTruc();
    }
    Puis dans le timeOut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window.setTimeout(function(){doFaireUnTruc(this);},1000);
    C'est pas gagné que ça marche, mais il faut essayer.

    This, est toujours un sujet très sensible en JS

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 185
    Points
    185
    Par défaut
    En fait pour les moteurs gecko, settimeout est une fonction a nombre variables d'arguments (>= 2). Les arguments après le 2e sont passés en paramètres à la fonction passée dans le premier argument.

  6. #6
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    http://www.developpez.biz/downloads/...erenceJS13.zip
    Dans le pdf, à la page 494.
    Il s'agit de la doc de Netscape (le créateur de JavaScript, je le rappel).

    Ceci dit c'est vrai que je ne trouve pas d'autre doc parlant de cette syntaxe de setTimeout bien qu'elle soit supportée par le moteur gecko.


    'tain pourquoi j'ai supprimé les source de fx de mon dd
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  7. #7
    Membre actif Avatar de FrankOVD
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juin 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2005
    Messages : 438
    Points : 254
    Points
    254
    Par défaut
    Et si tu n'envoyais à ta fonction que le nom de ton objet et que celle ci récupérait cet objet avec objet = document.getElementById(monId); ?
    Pensez à la balise

  8. #8
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    FrankOVD tu es hors sujet car il ne s'agit nullement d'un élément html, mais d'un objet JavaScript.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  9. #9
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    En effet, Celibri, la syntaxe existe, et est intéressante, même si apparement, seul Netscape y fait référence.
    Ca fonctionne sous FF même si il n'y font pas référence?

  10. #10
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Non mais en fait mon pseudo c'est Celelibi. Merci

    Cette syntaxe marche avec Netscape et tous ses dérivés de près ou de loin.
    Mozilla avec son moteur gecko n'est en fait qu'un fork de Netscape (pour ceux qui ont un peu suivi l'histoire).

    Et au passage, il s'agit de Firefox et non FireFox, qui s'abrège en FX et non FF.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 22
    Points
    22
    Par défaut Un Grand merci
    Je ne pensait pas que l'on allait me répondre aussi rapidement et précisement, merci à tous!

    Je vais essayer vos solutions et je rendrai le verdict demain, merci encore!

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Bingo Celelibi !
    Ca marche voici la source que j'ai insérée dans une page html vide.
    Par contre au risque de passer pour un blaireau, il semble que ça boucle à l'infini quelquepart, le chargement la page ne se termine jamais.
    Une idée?

    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
    <script language="javascript">
    			function monObj()
    			{
    				this.faireUnTruc=function monObj_faireUnTruc()
    				{
    					document.write("Je fais quelquechose!");
    				}
     
    				this.delai=function myTimer()
    				{
    					setTimeout(function (myThis) { myThis.faireUnTruc(); }, 1500, this);
    				}
    			}
     
    			toto=new monObj();
    			toto.delai();
    		</script>

    denisC pour ta version ça ne marche pas, apparement la fonction faireUnTruc() n'est pas encore définie au moment de la définition de la fonction doFaireUnTruc. Si j'inverse les 2 fonctions dans le source c'est doFaireUnTruc qui n'est pas défini dans mon setTimeout...

  13. #13
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    une autre piste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    this.delai=function myTimer() 
                { 
                   	secours=this;
    		setTimeout("secours.faireUnTruc()",1500); 
                }
    tu me diras, même problème de patinage sous ffx mais ça, c'est dû à ton document.write (aucun problème avec une alerte);

  14. #14
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    Ouais ça marche, merci javatwister.

    Juste nommer le this dans une variable locale, fallait y penser!

    Il y a un autre cas où le this peux poser problème. Imaginons un objet qui lors de sa construction créé un lien permettant d'appeler la fonction faireUnTruc(). Si j'en instancie 2 comment faire pour que chacun ait un lien qui lui est propre. l'idée étant ceci avec évidement la ligne construisant le lien fausse puisque this sera remplacé par la chaîne "Object":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function monObj()
    			{
    				this.faireUnTruc=function monObj_faireUnTruc()
    				{
    					document.write("coucou");
    				}
     
    				myThis=this;
     
    				document.write('<a href="javascript:'+this+'.faireUnTruc()'">Faire</a>');
    			}
    Là encore j'avais reglé le problème en passant en chaîne dans le constructeur le nom de ma variable contenant l'instance... pas bien!

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 26/06/2011, 15h21
  2. Vous utilisez le goto dans certains cas ?
    Par b Oo dans le forum C++
    Réponses: 23
    Dernier message: 21/10/2006, 17h08
  3. Empecher la validation dans certains cas ?
    Par elitost dans le forum Struts 1
    Réponses: 2
    Dernier message: 19/09/2006, 13h03
  4. Passer la validation Javascript dans certains cas
    Par tkino dans le forum Struts 1
    Réponses: 2
    Dernier message: 31/07/2006, 15h37
  5. [JOINTURES] interêt dans certain cas
    Par nicotine002 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/06/2006, 17h22

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