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.
- var vehicle = function(spec) {
- // the spec object contains all attributes needed to create the object.
- // create a new empty object using the object literal
- var o = {};
- // vars of this function are the private variables of the new object
- var age = 0;
- var maxSpeed = spec.maxSpeed;
- var name = spec.name;
- var price = spec.price;
- // private methods
- var calculateDegradation = function() {
- return age * price / 10 ; // assuming linear degradation
- };
- // public methods
- o.getName = function() {
- return name;
- };
- o.getMaxSpeed = function() {
- return maxSpeed;
- };
- o.setAge = function(v) {
- age = v;
- return o; // cascade pattern
- }
- o.getResidualValue = function() {
- return price - calculateDegradation();
- };
- return o;
- }
- var myVehicle = vehicle( { name: 'Audi R8',
- price: '106400',
- maxSpeed: '301'});
- alert(myVehicle.getMaxSpeed()); // 301
- alert(myVehicle.getResidualValue()); // 106400;
- alert(myVehicle.setAge(2).getResidualValue()); // 85120;
Hier das Beispiel:
Interessant ist die Ansicht im Firebug: Keine Spur von den privaten Methoden oder Instanzvariablen. Sie werden durch das “Closure” geschützt.
