Bonjour à tous,

j'ai consulté le tuto Programmation orientée objet avec le langage JavaScript de Thierry Templier où bon nombre de notions sont abordées ... sauf peut-être une (ou alors ai-je mal compris quelque chose).

Mon but est simple : créer un objet avec des attributs publiques, et d'autres privés. Je voudrais également pouvoir accéder à ces données depuis des méthodes publiques.

D'après le tuto, pour créer des attributs publiques et des méthodes publiques, il suffit de procéder comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
MaClasse = function _maClasse() { 
    this.attribut = "valeur"; 
    if( typeof MaClasse.initialized == "undefined" ) { 
        MaClasse.prototype.maMethode = function() { 
            alert("Attribut: " + this.attribut); 
        }; 
        MaClasse.initialized = true; 
    } 
};
Jusque là ça va ...
On nous dit également que si l'on veut réduire la portée de certaines variables, il "suffit" de procéder ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
MaClasse = function _maClasse() { 
    var _maVarPrivee = "privee";
};
Tout bêtement, je me suis donc dit, pour combiner les deux, il suffit de procéder de la sorte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
MaClasse = function _maClasse() { 
    var _attribut = "valeur"; 
    if( typeof MaClasse.initialized == "undefined" ) { 
        MaClasse.prototype.maMethode = function() { 
            alert("Attribut: " + this._attribut); 
        }; 
        MaClasse.initialized = true; 
    } 
};
et, puisque je suis là, vous comprenez bien que ça ne fonctionne pas ainsi.

D'abord, pour avoir accès à l'attribut, il faut, contrairement à ce que j'ai écrit ici, utiliser le code suivant (pas de this.) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
MaClasse = function _maClasse() { 
     var _attribut = "valeur"; 
     if( typeof MaClasse.initialized == "undefined" ) { 
         MaClasse.prototype.maMethode = function() { 
             alert("Attribut: " + _attribut); 
         }; 
         MaClasse.initialized = true; 
     } 
 };
Du coup en procédant ainsi, _attribut se comporte plus comme une variable statique (au sens du C). Elle est initialisée à la création du premier objet, et puis c'est tout.

Ma question est donc : comment faire pour que _attribut soit propre à chaque instance, et que le _attribut utilisé dans ma méthode maMethode soit bien celui de l'instance courante ?


Par avance, merci à quiconque pourra m'aider