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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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
    Si je veux une propiété privée, je fais comment ?

    J'ai essayé ça :

    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
    var Car = Object.create(Object.prototype);
    Car.wheels = 4;
    Car.drive = function () {
        this.speed = 120;
    };
     
    Car.create = function (constructor, model) {
     
        var prix = 100;
     
        return Object.create(Car, {
            constructor: {
                writable: true,
                configurable: true,
                value: constructor
            },
            model: {
                writable: true,
                configurable: true,
                value: model
            },
     
            getPrix: function () {
                console.log("le prix est : ", prix);
            }
        });
    };
     
    var volvo = Car.create("Volvo", "S60");
    volvo.getPrix();
    Mais ça marche pas...

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Le concept de propriété privée n'existe pas en JavaScript, mais une proposal est à l'étude (https://github.com/tc39/proposal-cla...private-fields). En attendant, ce qui s'en rapproche vaguement est de rendre la propriété non énumérable.

  3. #3
    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
    Pour les propriétés privées on en parlait (j’espère ne pas avoir dit de bêtises) justement ici :Analyse de 'Classes'....

    J'ai vu pleins de chapitres de bouquins qui proposent des solutions pour ça...

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Ce que tu suggères dans l'autre topic n'est pas une propriété privée mais une variable locale. Une propriété privée n'est visible et accessible que par son propriétaire (c'est à dire pour la prog objet par classe, le constructeur et les méthodes d'une classe). On parle bien de "propriété" ou "membre" privé et non de variable, car une propriété est privée au regard d'une classe, tandis qu'une variable est locale par rapport à un scope (la "portée" de la variable) et n'est pas rattachée à un objet parent, donc inutilisable dans une autre méthode par exemple.

    Il existe bien des solutions pour se rapprocher du comportement de propriété privée, par exemple en employant les Proxy et en vérifiant la valeur du mot-clé "this" avant d'autoriser l'accès à une propriété. C'est ce que j'ai fait avec ma bilbiothèque ObjectModel: http://objectmodel.js.org/#doc-private-and-constants ; mais ça ne fait pas partie du design du langage et l'intérêt des propriétés privées est très discutable en soi... mais il y a là de quoi ouvrir un tout nouveau débat.

  5. #5
    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
    Salut,

    Ok je précise (pour les autres) que ce sujet vient d'un autre fil (il y a eu un déplacement)...

    Citation Envoyé par SylvainPV Voir le message
    Ce que tu suggères dans l'autre topic n'est pas une propriété privée mais une variable locale. Une propriété privée n'est visible et accessible que par son propriétaire (c'est à dire pour la prog objet par classe, le constructeur et les méthodes d'une classe). On parle bien de "propriété" ou "membre" privé et non de variable, car une propriété est privée au regard d'une classe, tandis qu'une variable est locale par rapport à un scope (la "portée" de la variable) et n'est pas rattachée à un objet parent, donc inutilisable dans une autre méthode par exemple.
    Oui ce ne sont pas des propriétés, parlons de données privées/publiques dans ce cas, c'est mieux ?

    Ceci dit dans ce passage (de l'autre fil dont tu parles) :

    Citation Envoyé par Beginner. Voir le message
    En tant que débutant un peu perdu (te voilà prévenu) et vu que tu viens du C/C++ je dirais que c'est une méthode privée : si tu crées une instance de ClassName celle-ci n’aura pas accès à la méthode thirdFunction par contre elle aura accès aux méthodes firstMethod, secondMethod...
    Je dis méthode privée or une méthode en JS (si j'ai bien compris) c'est une propriété dont la valeur est une fonction du coup est-ce aussi incorrecte de parler de méthode privée ? Et qu'en est-il de "variables/méthodes" privées ou même de "membres privés" ?

    En tous cas j'ai vu certains*** utiliser des expressions comme "private/public members", "private/public methods", "private instance variables"... Et ça concerne aussi bien les variables que les fonctions...

    *** Même l'auteur que tu cites dans l'autre fil (sur Object.create) à savoir Douglas Crockford dans ce lien par exemple : Private Members in JavaScript ... Il écrit même "Private members are made by the constructor. Ordinary vars and parameters of the constructor become the private members."...

    Ainsi si je comprends bien les variables (locales) et les paramètres du constructeur deviennent des membres privés...

    Il va même jusqu'à dire qu'ils sont attachés à l'objet :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Container(param) {
            this.member = param;
            var secret = 3;
            var that = this;
        }
    This constructor makes three private instance variables: param, secret, and that. They are attached to the object, but they are not accessible to the outside, nor are they accessible to the object's own public methods. They are accessible to private methods. Private methods are inner functions of the constructor.

    Je cite un autre passage où il semble répondre à ceux qui prétendent que les objets JS ne peuvent pas avoir de variables/méthodes privées :

    Some argue that JavaScript is not truly object oriented because it does not provide information hiding. That is, objects cannot have private variables and private methods: All members are public.

    But it turns out that JavaScript objects can have private variables and private methods. (Click here now to find out how.) Of course, few understand this because JavaScript is the world's most misunderstood programming language.
    Source :JavaScript: The World’s Most Misunderstood Programming Language.


    ----> Il y a là aussi de quoi s'y perdre décidément il faut faire attention à beaucoup de choses en JS...


    -----------------

    Citation Envoyé par SylvainPV Voir le message
    Il existe bien des solutions pour se rapprocher du comportement de propriété privée, par exemple en employant les Proxy et en vérifiant la valeur du mot-clé "this" avant d'autoriser l'accès à une propriété. C'est ce que j'ai fait avec ma bilbiothèque ObjectModel: http://objectmodel.js.org/#doc-private-and-constants ; mais ça ne fait pas partie du design du langage et l'intérêt des propriétés privées est très discutable en soi... mais il y a là de quoi ouvrir un tout nouveau débat.
    Ah je me souviens que tu avais ouvert un fil à propos de cette bibliothèque, il faudrait que je regarde de nouveau pour voir si je comprends plus de choses qu'à l'époque...

    Citation Envoyé par grunk Voir le message
    Aujourd'hui la solution la plus simple est de passer par un transpiler du genre de typescript qui va "émuler" les propriétés privées au moment de la transpilation.

    Tu peux alors écrire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Animal {
        private name: string;
        constructor(theName: string) { this.name = theName; }
    }
     
    new Animal("Cat").name; // Error: 'name' is private;
    Merci pour cet exemple, je vais regarder de plus prés...

  6. #6
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Pour se mettre au clair sur le vocabulaire:
    variable = référence à une donnée accessible en lecture/écriture
    propriété = variable rattachée à un objet par une référence
    membre = synonyme de propriété, surtout utilisé par les anglophones
    méthode = propriété de type fonction

    L'adjectif "privé" implique que l'on parle d'une propriété par définition, si ce n'est pas une propriété alors il n'a pas de propriétaire et n'est donc privé au regard de rien du tout.

    Donc méthode privée oui, mais donnée privée ne veut pas dire grand chose. Une même donnée peut avoir plusieurs références, qui peuvent être des propriétés ou non, privées ou non.

  7. #7
    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
    Pour les propriétés privées/publics je pensais entre autres à cette exemple de code commenté (source #10) :

    Code javascript : 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
    var monProgramme = (function () {
      // déclaration de toutes les variables utilisées
      var maVar, maFonction; 
     
      // Remplir les variables
      maVar = "je suis privée et ne pollue pas";
      maFonction = function maFonction() {
        console.log("On ne peut pas m'appeler avec maFonction() de l'extérieur du module. Seulement avec log()");
      }
     
     // Retourne un objet ouvert au public qui contient ce qui doit l'être
     return {
       // setter qui permet de changer la valeur de maVar
       setMaVar: function setMaVar(valeur){
         maVar = valeur;
       },
     
       // getter qui permet de récupérer la valeur de maVar
       getMaVar: function getMaVar(){
         return maVar;
       },
     
       // Fonction Publique qui appelle une privée
       log: function log() {
         maFonction();
       }
     };
     
    })();
     
    console.log(monProgramme.getMaVar()); // "je suis privée et ne pollue pas"
    console.log(monProgramme.maVar); // undefined car n'est pas présente dans l'objet rendu public
    monProgramme.maVar = 'toto'; // modification de l'objet rendu public qui n'a rien à voir avec l'autre maVar
    console.log(monProgramme.getMaVar()); // toujours "je suis privée et ne pollue pas"
    monProgramme.setMaVar("on me change de l'extérieur car c'est permis !");
    console.log(monProgramme.getMaVar()); // "on me change de l'extérieur car c'est permis !"

    On voit aussi qu'avec une IIFE on peut fabriquer des objets alors je pose la même question que ma question 1 mais pour les IIFE...

    Il y a aussi plusieurs livres, articles, tutos qui en parlent plus ou moins de cette manière...


    Merci.

  8. #8
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Même chose, maVar et maFonction sont des variables locales, pas des propriétés privées puisque ce ne sont pas des propriétés, elles n'appartiennent pas à un objet. Si on déclare a posteriori d'autres méthodes sur cet objet, elles ne pourront pas accéder à ces variables car on ne sera plus dans le même scope. Inversement, ces variables sont accessibles depuis n'importe quel code à l'intérieur de l'IIFE, même si ce code n'a rien à voir avec l'objet retourné.

    Se servir d'une IIFE pour déclarer des variables sans polluer le scope extérieur est un pattern très utile, mais on ne peut pas appeler ça des propriétés privées, ni même des propriétés tout court.

  9. #9
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Aujourd'hui la solution la plus simple est de passer par un transpiler du genre de typescript qui va "émuler" les propriétés privées au moment de la transpilation.

    Tu peux alors écrire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Animal {
        private name: string;
        constructor(theName: string) { this.name = theName; }
    }
     
    new Animal("Cat").name; // Error: 'name' is private;
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    A noter que le caractère privé des propriétés TypeScript est seulement assuré par son compilateur. Dans le code JavaScript généré, ce sont des propriétés normales qu'il est facile de récupérer:

    Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Animal {
        private name: string;
        constructor(theName: string) { this.name = theName; }
    }
     
     
    alert(new Animal("Cat")['name']);

  11. #11
    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);
    			}
    		}

  12. #12
    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.

  13. #13
    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é.)

  14. #14
    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...

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