Private Methoden in JavaScript dank Closures

Momentan lese ich das Buch “JavaScript: The Good Parts” von Douglas Crockford.
Ein durchweg empfehlenswertes Buch, das eine klare und kompakte Übersicht über die Stärken (und Schwächen) von JavaScript bietet. Sehr interessant ist das “Functional”-Pattern: Mit Hilfe von Closures können private Instanzvariablen und Methoden definiert werden. In 4 Schritten erstellt eine sogenannte “Maker”-Methode eine neue Objekt-Instanz.
Erzeuge ein neues Objekt

Definiere in der Methode die (privaten) Instanzvariablen und Methoden.

Hänge an das neue Objekt die öffentlichen Methoden. Dank dem “Closure”-Prinzip haben nur diese Methoden Zugriff auf die vorher definierten Instanzvariablen und Methoden.

Gebe das neue Objekt zurück.
Hier das Beispiel:

  1. var vehicle = function(spec) {
  2.      // the spec object contains all attributes needed to create the object.
  3.  
  4.      // create a new empty object using the object literal
  5.      var o = {};    
  6.  
  7.      // vars of this function are the private variables of the new object
  8.      var age            = 0;
  9.      var maxSpeed       = spec.maxSpeed;
  10.      var name           = spec.name;
  11.      var price      = spec.price;
  12.  
  13.      // private methods
  14.      var calculateDegradation = function() {
  15.            return age * price / 10 ; // assuming linear degradation
  16.      };    
  17.  
  18.      // public methods
  19.      o.getName = function() {
  20.          return name;
  21.      };
  22.  
  23.      o.getMaxSpeed = function() {
  24.          return maxSpeed;
  25.      };
  26.  
  27.      o.setAge = function(v) {
  28.         age = v;
  29.         return o; // cascade pattern
  30.      }
  31.  
  32.      o.getResidualValue = function() {
  33.          return price – calculateDegradation();
  34.      };
  35.  
  36.      return o;
  37. }
  38.  
  39. var myVehicle = vehicle( { name: ‘Audi R8’,
  40.                                 price: ‘106400’,
  41.                                 maxSpeed: ‘301’});
  42.  
  43. alert(myVehicle.getMaxSpeed()); // 301
  44. alert(myVehicle.getResidualValue()); // 106400;
  45. alert(myVehicle.setAge(2).getResidualValue()); // 85120;

Interessant ist die Ansicht im Firebug: Keine Spur von den privaten Methoden oder Instanzvariablen. Sie werden durch das “Closure” geschützt.

Comments are closed.