|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mars 2011 Messages : 2 ![]() |
Bonjour,
J'ai récemment décidé de me mettre à la "POO" avec Javascript. J'utilise donc le prototypage, mais j'ai un soucis au niveau du code suivant (version simplifiée de mon code) : Code :
Dans la méthode add, je fais appel à un addEventListener pour executer une fonction au clic sur un bouton. Le soucis est le suivant : dans la méthode remove, this ne fait plus référence à ma classe mais à monBouton. Sauriez vous comment je pourrais faire référence aux propriétés cadre et boite dans la méthode remove ? Je vous remercie d'avance. |
||
|
|
00
|
|
|
#2 | ||||
|
Membre régulier
![]() Inscription : octobre 2010 Messages : 65 ![]() |
Salut !
En JavaScript utilisation du mot clef this dans une fonction, référence l’instance de l’objet qui maintien la référence sur cette fonction. Je m’explique, le gestionnaire d’événement du bouton garde une référence sur ta fonction remove, c’est donc le bouton qui appelle la fonction remove, changeant ainsi le context d’appelle , this référence donc le bouton . Il existe plusieurs méthodes pour sauvegarder le context d’appelle (this) , personnellement j’utilise le prototypage de fonction pour y ajouter une mécanique de delegate, comme ce ci : Code :
Code :
|
||||
|
|
00
|
|
|
#3 | ||
![]() ![]() ![]() Didier MouronvalDéveloppeur Web Inscription : juin 2008 Messages : 13 807 ![]() |
Une autre technique consiste à conserver la référence à this dans une variable :
Code :
__________________
Pas de question technique par MP ! Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi ! Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi ! Mes formations video2brain : La formation complète sur JavaScript • JavaScript et le DOM par la pratique • PHP 5 et MySQL : les fondamentaux Mon livre sur jQuery
|
||
|
00
|
|
|
#4 | ||
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
La dernière ne marchera pas, me n'est pas dans le même scope. Par contre l'idée est la même :
Code :
|
||
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() Romain VALERIPOOête Inscription : avril 2008 Messages : 2 573 ![]() |
Moi c'est plutot ce passage qui me chiffonne
Dans la mesure où la fonction add ne retourne aucune valeur... pourquoi vouloir stocker "rien" dans une propriété de l'objet ?(si c'est parce que tu voulais à la fois créer cette propriété tout en laissant une valeur "undefined" ET que tu as voulu "gagner" une ligne, ne me l'avoue surtout pas ça va me faire du mal )
__________________
...pour les linguistes et les curieux >>> générateur de phrases aléatoires __________________ |
|
|
00
|
|
|
#6 | |||||||
|
Membre régulier
![]() Inscription : octobre 2010 Messages : 65 ![]() |
Citation:
le branchement de la méthode remove a l'evenement "Click" du bouton ne pose aucun problème ... mais c'est lors de l’exécution de la méthode remove que le problème survient ! tu doit confondre avec la technique de la fonction "anonyme" : Code :
l'autre technique viable, dont parlé Bovino, est de sauvegarder le context this dans une variable de la fonction contructeur mais contrairement a son exemple il faut tous déclarer dans le contructeur,meme les methodes, et bannir l'utilisation du mot clef this comme ceci : Code :
![]() mais ne support pas le prototypage
|
|||||||
|
|
00
|
|
|
#7 | |
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
Citation:
Lorsque add est appelée, on peut oser espérer que c'est sur maClasse. Donc me=this pointe bien sur maClasse. A fortiori lorsque me.remove est appelé, this réfère me, qui réfère bien maClasse. |
|
|
|
00
|
|
|
#8 | ||||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 869 ![]() |
Vous êtes fous !
Code :
ou plus largement Code :
|
||||
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() Romain VALERIPOOête Inscription : avril 2008 Messages : 2 573 ![]() |
![]() @threonine : ça va ? y'a de quoi faire, là... tu t'en sors ? ^^
__________________
...pour les linguistes et les curieux >>> générateur de phrases aléatoires __________________ |
|
|
00
|
|
|
#10 | |||||
|
Membre régulier
![]() Inscription : octobre 2010 Messages : 65 ![]() |
Citation:
En EcmaScript this est redéfinit a chaque exécution, il peut pointer n’importe quel type … soit le développeur détermine l’objet que this référencera grâce aux méthodes call et apply sinon il référence l’objet qui maintient la référence sur la fonction … ce n’est pas très claire , un petit exemple pour illustrer mes propos : Code :
Citation:
Citation:
|
|||||
|
|
00
|
|
|
#11 | ||
|
Membre habitué
![]() Étudiant Inscription : mai 2011 Messages : 226 ![]() |
p3ga5e, pourquoi ça marche pas ça ? Po compris
Code :
donc monBouton.addEventLIstener va executer Code :
monBouton.cadre.removeChild(monBouton.boite); |
||
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() Inscription : octobre 2010 Messages : 65 ![]() |
Oui ! enfin presque !
La fonction remove n’est pas appelé lors du addEventListener, mais lors d’un click utilisateur, addEventListener ne fait que sauvegarder la référence de la fonction remove. Mais le problème reste le même c’est bien monBouton qui appel la fonction remove donc this = monBouton lors de l'evenment click ! |
|
|
00
|
|
|
#13 |
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
Et boum!
toussa pour économiser un , ca m'apprendra (dans les deux sens...)
|
|
|
00
|
|
|
#14 | |||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 869 ![]() |
Citation:
alors qu'avec Code :
function(){me.remove();/*this==monButton*/} sera équivalent à avec me l'objet(de maClasse) qui a appelé "add" initialement. edit: Code :
monBouton.addEventListener('click',me.remove,false); c'est exactement comme si tu faisais : Code :
monBouton.addEventListener('click',function(){this.cadre.removeChild(this.boite);},false); Code :
me.remove == maClasse.prototype.remove == function(){this.cadre.removeChild(this.boite);} |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com