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.

  1. Erzeuge ein neues Objekt
  2. Definiere in der Methode die (privaten) Instanzvariablen und Methoden.
  3. 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.
  4. Gebe das neue Objekt zurück.
  5. 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.

    myVehicle Ansicht im Firebug zeigt nur die öffentlichen Methoden.

    Bookmark and Share

Leave a Reply