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 : 41
    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