JavaScript Membres privés


Exemple

JavaScript ne prend pas en charge techniquement les membres privés en tant que fonctionnalité linguistique. La confidentialité - décrite par Douglas Crockford - est émulée à la place par des fermetures (portée de fonction préservée) qui seront générées à chaque appel d'instanciation d'une fonction constructeur.

L'exemple de Queue montre comment, avec les fonctions constructeur, l'état local peut être préservé et rendu accessible via des méthodes privilégiées.

class Queue {

  constructor () {                    // - does generate a closure with each instantiation.

    const list = [];                  // - local state ("private member").

    this.enqueue = function (type) {  // - privileged public method
                                      //   accessing the local state
      list.push(type);                //   "writing" alike.
      return type;
    };
    this.dequeue = function () {      // - privileged public method
                                      //   accessing the local state
      return list.shift();            //   "reading / writing" alike.
    };
  }
}


var q = new Queue;            //
                              //
q.enqueue(9);                 // ... first in ...
q.enqueue(8);                 //
q.enqueue(7);                 //
                              //
console.log(q.dequeue());     // 9 ... first out.
console.log(q.dequeue());     // 8
console.log(q.dequeue());     // 7
console.log(q);               // {}
console.log(Object.keys(q));  // ["enqueue","dequeue"]

À chaque instanciation d'un type de Queue le constructeur génère une fermeture.

Ainsi , les deux d'une Queue d' enqueue dequeue Object.keys(q) list Queue propres méthodes de Type enqueue et dequeue (voir Object.keys(q) ) font encore avoir accès à la list qui continue à vivre dans sa portée englobante qui, au moment de la construction, a été préservée.

En utilisant ce modèle - en émulant les membres privés via des méthodes publiques privilégiées - il faut garder à l’esprit qu’à chaque instance, de la mémoire supplémentaire sera consommée pour chaque propre méthode de propriété (car c’est du code qui ne peut pas être partagé / réutilisé). Il en va de même pour la quantité / la taille de l’état qui sera stockée dans une telle fermeture.