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 :

Propriétés privées en JavaScript


Sujet :

JavaScript

  1. #21
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Citation Envoyé par Beginner. Voir le message
    Mais ça marche pas...
    Cela a peut-être déjà été dit dans la discussion : il faut également mettre un descripteur pour la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		getPrix:{
    			value: function () {
    				console.log("le prix est : ", prix);
    			}
    		}

  2. #22
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Bonjour,

    Oui merci Loralina.

  3. #23
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonsoir,
    Je poursuis ici la discussion relative à ce message car ma réponse cadre mieux avec ce sujet.

    Citation Envoyé par Beginner. Voir le message
    Ah ça c'était pour moi, car je n'étais pas sûr qu'avec la méthode 1 chaque objet avait sa propre copie de uneVar ("variable privée")...Les console.log montrent que c'est bien le cas apparemment (avec la méthode 1 mais pas avec la méthode 2 bien sûr).
    D'accord, c'était donc un test pour savoir ce qui allait être en commun (j'avais initialement supposé que vous cherchiez à obtenir le même résultat avec les deux méthodes).

    Citation Envoyé par Beginner.
    Je crois que question mémoire*** la 2 est préférable mais y a-t-il autre chose à considérer pour faire le meilleur choix ?
    Justement :
    Citation Envoyé par Beginner.
    Bien sûr là, la fonction usine n’apporte rien mais dans d'autres cas, d'une manière générale, on peut, avec une fonction usine, passer des paramètres, ajouter des "variables privées" et/ou des "méthodes privées"...
    Avec la méthode 2, "uneVar" s'apparente vaguement à une propriété statique privée de classe.
    Elle est en commun comme vous l'avez remarqué, contrairement à la méthode 1.
    Si on a besoin d'une variable "privée", le fait de la vouloir commune ou non, c'est plutôt également un critère pour orienter son choix entre les méthodes 1 et 2, non ?

    Ensuite, concernant la méthode 2 :
    Pour avoir une variable comparable, mais qui soit propre à chaque instance, il faudra à priori générer autant de contextes contenant cette variable que d'instances.
    J'ai réfléchi à une façon de faire ça (toujours dans le style de la méthode 2), tout en mettant l'essentiel des méthodes en commun.
    Le code est plutôt expérimental et sans doute pas très intéressant, mais il s'agit aussi de voir l'impact sur la mémoire.
    C'est à relire car il y a beaucoup de copier-coller.
    En particulier, il faut vérifier qu'il n'y a pas de faille.
    Code html : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    <!DOCTYPE html>
    <html lang="fr">
    	<head><meta charset="utf-8"></head>
    	<body>
    		Testez l'un ou l'autre, pas les deux en même temps.<br><br>
    		<div onclick="creer(tutu);" style="cursor:pointer;">Créer sur le prototype "tutu" (code plus complexe, normalement plus lent à l'utilisation des méthodes, mais 409 Mo en mémoire sur Firefox)</div><br>
    		<div onclick="creer(titi);" style="cursor:pointer;">Créer sur le prototype "titi" (code plus simple, normalement plus rapide à l'utilisation des méthodes, mais 1097 Mo en mémoire sur Firefox)</div><br>
    		Puis capturez un instantané (F12 puis onglet "Mémoire").
    <script>
    var tutu=(function()
            {
            var _verrou;
     
            _verrou=true;
            return {
                    initialiser:function()
                            {
                            var ob_prive={nb_1:0,nb_2:0,nb_3:0,nb_4:0,nb_5:0,ar_1:[]};
                            this._getVariablePrivee=function(st_nom) {if(_verrou!==false) {throw "erreur";} return ob_prive[st_nom];};
                            this._setVariablePrivee=function(st_nom,mx_valeur) {if(_verrou!==false) {throw "erreur";} ob_prive[st_nom]=mx_valeur;}
     
                            //alternative, mais 100 Mo de plus
                            /*var nb_1=0,nb_2=0,nb_3=0,nb_4=0,nb_5=0,ar_1=[];
                            this._getVariablePrivee=function(st_nom) {if(_verrou!==false) {throw "erreur";} return eval(st_nom);};
                            this._setVariablePrivee=function(st_nom,mx_valeur) {if(_verrou!==false) {throw "erreur";} eval(st_nom+"=mx_valeur");}*/
                            },
                    getNombre1:function()
                            {
                            var nb_;
     
                            _verrou=false;nb_=this._getVariablePrivee("nb_1");_verrou=true;
                            return nb_;
                            },
                    setNombre1:function(nb_)
                            {
                            if(typeof nb_!=="number")
                                    {
                                    throw "erreur";
                                    }
                            _verrou=false;this._setVariablePrivee("nb_1",nb_);_verrou=true;
                            },
                    getNombre2:function(){var nb_;_verrou=false;nb_=this._getVariablePrivee("nb_2");_verrou=true;return nb_;},
                    setNombre2:function(nb_){if(typeof nb_!=="number"){throw "erreur";}_verrou=false;this._setVariablePrivee("nb_2",nb_);_verrou=true;},
                    getNombre3:function(){var nb_;_verrou=false;nb_=this._getVariablePrivee("nb_3");_verrou=true;return nb_;},
                    setNombre3:function(nb_){if(typeof nb_!=="number"){throw "erreur";}_verrou=false;this._setVariablePrivee("nb_3",nb_);_verrou=true;},
                    getNombre4:function(){var nb_;_verrou=false;nb_=this._getVariablePrivee("nb_4");_verrou=true;return nb_;},
                    setNombre4:function(nb_){if(typeof nb_!=="number"){throw "erreur";}_verrou=false;this._setVariablePrivee("nb_4",nb_);_verrou=true;},
                    getNombre5:function(){var nb_;_verrou=false;nb_=this._getVariablePrivee("nb_5");_verrou=true;return nb_;},
                    setNombre5:function(nb_){if(typeof nb_!=="number"){throw "erreur";}_verrou=false;this._setVariablePrivee("nb_5",nb_);_verrou=true;},
                    getTableau1:function(){var ar_;_verrou=false;ar_=this._getVariablePrivee("ar_1").slice(0);_verrou=true;return ar_;},
                    setTableau1:function(ar_){if((ar_ instanceof Array)===false || ar_.length>10){throw "erreur";}_verrou=false;this._setVariablePrivee("ar_1",ar_);_verrou=true;}
                    };
            }());
    var titi=(function()
            {
            return {
                    initialiser:function()
                            {
                            var nb_1=0,nb_2=0,nb_3=0,nb_4=0,nb_5=0,ar_1=[];
                            this.getNombre1=function() {return nb_1;};
                            this.setNombre1=function(nb_) {if(typeof nb_!=="number") {throw "erreur";} nb_1=nb_;};
                            this.getNombre2=function() {return nb_2;};
                            this.setNombre2=function(nb_) {if(typeof nb_!=="number") {throw "erreur";} nb_2=nb_;};
                            this.getNombre3=function() {return nb_3;};
                            this.setNombre3=function(nb_) {if(typeof nb_!=="number") {throw "erreur";} nb_3=nb_;};
                            this.getNombre4=function() {return nb_4;};
                            this.setNombre4=function(nb_) {if(typeof nb_!=="number") {throw "erreur";} nb_4=nb_;};
                            this.getNombre5=function() {return nb_5;};
                            this.setNombre5=function(nb_) {if(typeof nb_!=="number") {throw "erreur";} nb_5=nb_;};
                            this.getTableau1=function() {return ar_1.slice(0);};
                            this.setTableau1=function(ar_) {if((ar_ instanceof Array)===false || ar_.length>10) {throw "erreur";} ar_1=ar_;}
                            },
                    };
            }());
    function creer(ob_modele)
            {
            var ar_2,i,ob_1,ob_2;
     
            ar_=[];
            i=1000000;
            while(--i>=0)
                    {
                    (ar_[i]=Object.create(ob_modele)).initialiser();
                    }
            ob_1=ar_[0];
            ob_2=ar_[1];
            ob_1.setNombre1(78);
            ob_2.setNombre1(13);
            ob_1.setTableau1([1,2,3]);
            ar_2=ob_1.getTableau1();
            ar_2[0]=4;
            console.log(ob_1.getNombre1(),ob_2.getNombre1(),ar_2,ob_1.getTableau1()); //78 13 [4,2,3] [1,2,3]
            ob_1._setVariablePrivee(); //erreur
            }
    var ar_;
    </script>
    		</body>
    </html>
    Sur la mémoire, j'ai fait ces tests :
    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
    <script>
    var ar_=[];
    var i=1000000;
     
    //73,3 Mo
    while(--i>=0)
    	{
    	ar_[i]=function()
    		{
    		var i=321321312;
    		var j="aeraer";
    		var k;
    		if(i===4554) {k="jreipqefjipdsfkm,fgnklgrsnuosvdbuifbuaeinpsdpefopkzerezr";}
    		else if(i===321321312) {k="jipqefjipdsfkm,fgnkdsffezeze879zer879ze879gsfgsfgsjiosfjiosfjidsnjkeqezpioqzjiopqzjopsfq";}
    		};
    	}
    /*
    //73,3 Mo
    while(--i>=0)
    	{
    	ar_[i]=function() {};
    	}
     
    //9,3 Mo
    var fc_=function() {};
    while(--i>=0)
    	{
    	ar_[i]=fc_;
    	}*/
    console.log("fin");
    </script>
    Le volume du code de la fonction ne semble pas jouer.

    Encore une chose : apparemment, il était possible avant avec eval d'aller modifier sur Firefox une variable locale à un contexte depuis l'extérieur :
    https://blog.lesieur.name/les-contextes-d-execution/ ("Dans de vieilles implémentations...")

    (16/4 10h12 : j'ai simplifié le code qui était inutilement compliqué.)

  4. #24
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Merci Loralina.

    Alors j'ai testé mais les premières fois les navigateurs FF et Chrome se sont mis à consommer trop de mémoire, je ne sais pas pourquoi, je devais avoir un problème ailleurs...

    Bon après j'ai diminué le nombre de boucles...

  5. #25
    Membre expérimenté
    Avatar de Paleo
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2013
    Messages : 242
    Par défaut
    Citation Envoyé par grunk Voir le message
    Et pour les gens comme moi qui n'arrivent pas à se plier au paradigmes de JS il reste les transpilers qui permettent de travailler comme avec des langages plus "classique". Faut juste pas être trop regardant sur le code généré
    Le code généré par TypeScript est impeccable.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/08/2012, 16h41
  2. Accéder aux propriétés css en javascript
    Par maxwel56 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/05/2012, 17h03
  3. [Objet] Accès à propriété privée depuis méthode statique
    Par Invité dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 20/09/2011, 13h39
  4. Changer propriété css si javascript désactivé
    Par christ8phe dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/03/2011, 11h57
  5. Utilisation de la propriété src de javascript
    Par pas30 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/12/2007, 11h15

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