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] Portée de variables


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut [POO] Portée de variables
    Salut,

    Je continue mon exploration de la programmation orientée objet en Javascript. J'ai un problème sur la portée d'une variable (comme il est dit dans le titre). Voici de quoi illustrer mes propos :
    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
    24
    25
    26
    27
    28
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>test js</title>
    </head>
    <body>
        <script type="text/javascript">
    	function o1() {
    		this.f1 = function() {
    			return "f1";
    		}
    	}
    	function o2(a) {
    		o1.call(this, a)
    		function f3() {
    			return this.f1;
    		}
    		this.f4 = function() {
    			f3();
    		}
    	}
    	o2.prototype = new o1;
     
    	var t1 = new o2();
    	alert(t1.f4(this));
        </script>
    </body>
    </html>
    Comment récupérer f1 dans le scope de f3, si j'ai bien compris les termes?

    Merci par avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    ben tu ne peux pas du fait de la portée relative de la "variable" qui peut être comparée çà une propriété de l'objet avec le this.
    et le propre des propriétés c'est d'être propres à un objet
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  3. #3
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    En fait j'avais aussi oublié un return, ça me retournait tout le temps undefined. En fait c'est possible en redéfinissant la prorpiété en tant que variable locale, mais je trouve ça fastidieux :
    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
    function o1() {
    	this.f1 = function() {
    		return "f1";
    	}
    	function f2() {
    		return "f2";
    	}
    }
    function o2(a) {
    	o1.call(this, a)
    	var fbis = this.f1;
     
    	function f3() {
    		return fbis();
    	}
    	this.f4 = function() {
    		return f3();
    	}
    }
    o2.prototype = new o1;
     
    var t1 = new o2();
    alert(t1.f4());
    si vous avez une autre façon de faire, je suis preneur. Je qualifierai la discussion comme résolue un peu plus tard.

  4. #4
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Pour être plus clair, quand tu déclares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	function o2(a) {
    		o1.call(this, a)
    		function f3() {
    			return this.f1;
    		}
    		this.f4 = function() {
    			f3();
    		}
    	}
    La fonction f3 peut être considérée uniquement comme une variable interne à ta fonction o2, c'est à dire qu'elle n'a pas d'existence hors de cette fonction et n'est donc pas partagée dans le scope de celle ci. Seuls les membres attachés à l'objet this sont partagés.

    Ceci étant, je ne sais pas si c'est normal, mais il y a beaucoup de choses étranges dans ton code (peut être du au fait que c'est juste un exemple)

    Edit: t'avais répondu entre temps. C'est quoi que tu cherches a faire exactement?

  5. #5
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    C'est clairement un exemple. En fait, je cherche à étendre un objet o1 vers o2. Mons soucis est d'utiliser des méthodes de o1 dans des méthodes de o2. L'idée est:
    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
    24
    function o1() {
    	this.f1 = function() {
    		return "f1";
    	}
    	function f2() {
    		return "f2";
    	}
    }
    function o2(a) {
    	o1.call(this, a)
    	var f1 = this.f1;
     
    	function f3() {
    		alert(f1() + " qqch"); 
    	}
    	this.f4 = function() {
    		f3();
    		return f1() + " qqch d'autre";
    	}
    }
    o2.prototype = new o1;
     
    var t1 = new o2();
    alert(t1.f4());
    Après je suis preneur de toute remarque, lachez vous!

  6. #6
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    T'as plusieurs façons de faire.

    L'une d'entre elles est de déclarer tes fonctions via l'objet prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    o1.prototype.foo = function(){}
    De cette façon, ton
    te permet de récupérer toutes les méthodes ajoutées au prototype de 01 dans 02

    L'autre façon consiste à recopier tous les objets de o1 dans o2, avec une fonction comme ceci par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function extend(parent, fils)
    {
    	for(var prop in parent)
    	{
    		fils[prop] = parent[prop];
    	}
    }
    Attention quand même, avec cette méthode, tu ne peux copier que les objets attachés à l'objet this. Ton f1 dans o2 par exemple ne sera pas copié.


    NB: en écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for(var prop in parent.prototype)
    	{
    		fils.prototype[prop] = parent[prop];
    	}
    tu te retrouves dans le premier cas.

  7. #7
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Je trouve la première méthode moins lisible, c'est pour ça que je ne l'utilise pas.
    J'utilise bien this et pour différencier les méthodes publiques et privées.

    Concernant la seconde façon de faire, quelle est la différence avec un o1.call(this, bla)?

  8. #8
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    J'avais déjà remarqué que call exécutait o1 au moment de l'instanciation de o2.

    J'aime l'idée de la fonction extend, mais je ne pense pas pouvoir l'utiliser. Comme j'utilise une API, j'ai une initialisation à faire. Chose que je ne montre pas dans mes exemples désolé.
    Je dois donc exécuter o1 quoiqu'il arrive ou copier la partie initialisation dans o2, ce que je ne trouve pas très propre non plus...

    Pour le fun, une autre syntaxe, sur deux lignes cette fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function o2(a1, a2, a3) {
        this.base = o1;
        this.base(a1, a2, a3);
        // ...
    }

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

Discussions similaires

  1. [POO] Portée des variables
    Par jpean.net dans le forum Langage
    Réponses: 4
    Dernier message: 02/04/2007, 20h52
  2. [POO] Portées des variables //
    Par hisy dans le forum Langage
    Réponses: 5
    Dernier message: 01/02/2007, 13h55
  3. [POO] Portée des variables de classe
    Par guidav dans le forum Langage
    Réponses: 3
    Dernier message: 31/01/2007, 19h27
  4. [POO] un truc me chagrine (portée des variables ?)
    Par novices dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2006, 15h05
  5. [FLASH MX 2004][XML]portée de variable
    Par marco_ dans le forum Flash
    Réponses: 8
    Dernier message: 29/04/2004, 15h47

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