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

Bibliothèques & Frameworks Discussion :

[Objet] Mutateurs sur les attributs


Sujet :

Bibliothèques & Frameworks

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut [Objet] Mutateurs sur les attributs
    Bonjour,

    j'ai créé une classe avec des membres que j'aimerais garder privées.

    Voici le code :

    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
    29
    30
    function Batiment(name, width, height)
    {
    	/* Attributes */
    	var _name = name;
    	var _width = width;
    	var _height = height;
     
    	/* Methods */
    	Batiment.prototype =
    	{
    		show : function()
    		{
    			alert("Name : " + _name + " ; size : [" + _width + "," + _height + "]");
    		}
     
    		/* Mutators */
    		setSize : function(width, height)
    		{
    			_width = parseInt(width);
    			_height = parseInt(height);
    		}
     
    		getWidth : function() { return _width; }
    		getHeight : function() { return _height; }
    	}
    }
     
    var myBat = new Batiment("test");
    myBat.setPosition(10, 10);
    myBat.show();
    Seulement ce code ne fonctionne pas...

    Erreur*: missing } after property list

    Code Source*:
    setSize : function(width, height)
    Si quelqu'un aurait une idée ?

    Par ailleurs, j'aimerais pouvoir retourner le couple width, height dans un seul et unique getter, comment puis-je faire ça proprement?

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Je viens de voir que j'ai tout mélangé

    Voici mon nouveau code :

    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
    29
    /* Batiment structure */
    function Batiment(name, width, height)
    {
    	/* Attributes */
    	var _name = name;
    	var _width = width;
    	var _height = height;
     
    	/* Methods */
    	Batiment.prototype.show = function()
    	{
    		alert("Name : " + _name + " ; size : [" + _width + "," + _height + "]");
    	}
     
    	/* Mutators */
    	Batiment.prototype.setSize = function(width, height)
    	{
    		_width = parseInt(width);
    		_height = parseInt(height);
    	}
     
    	Batiment.prototype.getWidth = function() { return _width; }
    	Batiment.prototype.getHeight = function() { return _height; }
    }
     
    var myBat = new Batiment("test");
    myBat.setPosition(10, 30);
    myBat.setSize(20, 40);
    myBat.show();
    Est-ce la bonne approche?
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  3. #3
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Salut,

    Il y a en fait 3 notions de visibilité en javascript. 2 sont faciles à comprendre : privé (visible uniquement dans la classe)
    public (visible partout - mais qui n'ont pas accès aux membres privés).
    et le drenier qui n'est pas protected, mais 'privileged'

    les membres privilégiés sont déclarés dans le constructeur à l'aide de this. Ils accèdent aux membres publics et privés et sont accessible depuis une indtance.

    (A noter que tout ceci n'a rien à voir avec le framework prototype)



    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
    29
    30
    31
    32
    33
    34
    35
    var MaClasse = function(name, secret) {
      /* membres privés */
      var _secret = secret;
      var rnd = function() {
        alert(Math.random());
      };
      /* membres "privilégies" */
      this.name = name;
      this.getSecret = function() {
        alert(_secret );
      }
      this.getRnd = function() {
      	rnd();
      }
     
    };
     
    /* membres public */
    MaClasse.prototype.membrePublic = "a";
    MaClasse.prototype.methodePublic = function(){
      alert(this.membrePublic )
    };
     
    MaClasse.prototype.methodePublic2 = function() { 
      this.getRnd() 
    };
     
    	var a = new MaClasse("nom", "secret");
    	alert(a.membrePublic);
    	a.methodePublic();
    	a.getSecret();
     
    	// a.rnd();        // ne fonctionnera pas : rnd est privée,
    	a.getRnd();        // fonctionnera : getRnd est privilégiée, elle a accès aux membres privés
    	a.methodePublic2(); // fonctionne : methodePublic2 fait appel à un membre privilégié
    Maintenant, si dans une méthode privée, nous avons besoin d'accéder à un membre public, la solution est de déclarer un membre privé (that) qui est this :

    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
    var MaClasse2 = function(name) {
      /* membres privés */
      var that = this;
      var methodePrivee = function() {
      	alert(that.name);
      };
     
      /* membres "privilégies" */
      this.name = name;
      this.getName = function() {
      	methodePrivee();
      };
    };
    	var b = new MaClasse2("nom");
    	b.getName();
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/06/2007, 16h28
  2. Réponses: 1
    Dernier message: 19/04/2007, 02h37
  3. Réponses: 2
    Dernier message: 17/04/2007, 17h14
  4. [SQL] Besoin d'aide sur les attributs pour une requete
    Par bobobobo01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/11/2006, 21h39
  5. question sur les attributs javascript
    Par PAYASS59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/04/2005, 13h34

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