Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/03/2011, 14h30   #1
Membre du Club
 
Inscription : novembre 2005
Messages : 194
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 194
Points : 61
Points : 61
Par défaut changer de this dans l'appel d'une fonction anonyme

bonjour

Comment fait on pour modifier le this d'une fonction de callBack?

par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
//méthode init de la classe maClasse
init : function(){
    //this => objet instancié de maClasse
    if(window.navigator.geolocation){
	    window.navigator.geolocation.getCurrentPosition(function(position){
                //this => PAS objet instancié de maClasse
                //comment faire pour que ce soit le cas
            });
    }
}
merci
kimcharlene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 14h41   #2
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
this n'est pas modifiable

tu peux faire this=that
modifier that et retourner that

du coup tu est obligé de faire

Code :
objet=objet.mafontion()
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h01   #3
Membre du Club
 
Inscription : novembre 2005
Messages : 194
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 194
Points : 61
Points : 61
biensur qu'il est modifiable...
J'arrive à le faire via mootools avec la méthode bind

http://mootools.net/docs/core/Types/...#Function:bind

Mais je n'y arrive pas en "natif".
kimcharlene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h03   #4
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
c'est du prototype this n'est pas modifiable dans une fonction anonyme !
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h05   #5
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
Code :
1
2
3
4
5
6
7
8
9
10
11
12
String.prototype.bar=function(){
this= this.toUpperCase()
return this
}
alert("coucou".bar())
 
 
 
String.prototype.foo=function(){
return this.toUpperCase()
}
alert("coucou".foo())
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h33   #6
Membre du Club
 
Inscription : novembre 2005
Messages : 194
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 194
Points : 61
Points : 61
Dès que ça parle de prototype je suis pommé :s

Quand je fais avec mootools j'ai bien mon this, comment faire sans mootools?

Code :
1
2
3
4
5
6
7
8
9
//méthode init de la classe maClasse
init : function(){
    //this => objet instancié de maClasse
    if(window.navigator.geolocation){
	    window.navigator.geolocation.getCurrentPosition(function(position){
                //this => objet instancié de maClasse
            }.bind(this));
    }
}
kimcharlene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 16h08   #7
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 854
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 854
Points : 1 354
Points : 1 354
Citation:
Envoyé par kimcharlene Voir le message
Dès que ça parle de prototype je suis pommé :s

Quand je fais avec mootools j'ai bien mon this, comment faire sans mootools?

Code :
1
2
3
4
5
6
7
8
9
//méthode init de la classe maClasse
init : function(){
    //this => objet instancié de maClasse
    if(window.navigator.geolocation){
	    window.navigator.geolocation.getCurrentPosition(function(position){
                //this => objet instancié de maClasse
            }.bind(this));
    }
}
Code :
1
2
3
4
var that = this;
window.navigator.geolocation.getCurrentPosition(function(position){
                //that => objet instancié de maClasse
            });
autrement tu rédéfinis bind toi-même :
Code :
1
2
3
4
5
 
Function.prototype.bind = function(obj){
  var fn = this;
  return function(){ fn.apply(obj,arguments);};
}
sinon le mélange des 2 :
Code :
1
2
3
4
5
6
7
 
var that = this;
window.navigator.geolocation.getCurrentPosition(function(pos){
                return (function(position){
                                //ton code ici avec le bon this;
                }).call(that,pos);
            });
edit: ayant codé la dernière fonction à l'aveugle, j'ai quand même été pris d'un doute et je me suis fait un petit test et "oh surprise, ça fonctionne nickel du premier coup", j'suis trop fier de moi.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function callback(fn){
	fn();
}
 
function init(){
	this.instance = "instance de init";
	var that = this;
	callback(function(pos){
                return (function(position){
                                alert(this.instance);
                }).call(that,pos);
	});
}
 
new init();
edit2: window.navigator.geolocation.getCurrentPosition n'existe pas sous IE
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 16h57   #8
Membre du Club
 
Inscription : novembre 2005
Messages : 194
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 194
Points : 61
Points : 61
j'ai opté pour la définition du bind par moi même, je trouve cette solution bcp plus élégante.

Je vous remercie pour cette aide précieuse, ça marche niquel maintenant .
kimcharlene est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h26.


 
 
 
 
Partenaires

Hébergement Web