Olaf Schneider: begrenzte Sichtbarkeit lokaler Werte bzw. Objekte einer Funktion

Beitrag lesen

Hallo Peter,

vielen Dank erst einmal für Deine ausführliche und interessante Antwort.

Ich komme mal direkt auf Dein zweites Beispiel zu sprechen (meine Kommentare stehen hinter der entsprechenden Codezeile):

/*

[link:http://jconsole.com/]
*/

var Foo = (function (/id/) { // [[Foo]] constructor wrapper

Dieser Code wird jedes Mal ausgeführt, wenn ich new Foo() aufrufe. Richtig?

var SpecialIdFunctor = (function (that) { // [[SpecialId]] -Functor(, -Interface, -Behavior, ... -Monad?)

Die in Foo lokale Variable SpecialIdFunctor wird also auch jedes Mal neu aufgebaut.

var getSpecialId = (function () {
      return (that.getId() + 1);
    });

that ist ein Verweis auf FooConstructor, also ist die Methode getId() bekannt. Das ist mir klar.

this.showSpecialId = (function() {
      return getSpecialId();
    });

getSpecialId ist vorher lokal definiert, auch klar.

});

warum umschließt Du die function mit Klammern, wenn Du sie nicht ausführst. Deine Coding Guidelines?

var FooConstructor = (function (id) { // [[Foo]] constructor

SpecialIdFunctor.call(this, this); // applying the [Functor](, [Interface], [Behavior], ... [Monad]?)

this.getId = (function () {
      return id;
    });
  });

return FooConstructor;

})();

auch der Rest des Codes ist mir nach und nach klar geworden. Was ich allerdings nicht verstehe, wo jetzt die Vorteil gegenüber dem intuitiverem folgenden Code liegen:

[code lang=javascript]Foo = function(id) {

var that = this;

var getSpecialId = function() {
        return that.getId() + 1;
    }

this.getId = function() {
        return id;
    }

this.showSpecialId = function() {
        return getSpecialId();
    }

}

  
Sie scheint mir auf den ersten Blick innen ähnlich und nach außen identisch aufgebaut, ohne Nachteile zu haben.  
  
Meine ursprüngliche Frage zielte darauf ab, bestimmte Teile wirklich nur einmal im Prototype zu haben, damit bestimmte Funktionen (aber eben nicht alle) nur einmal vorhanden sind und nicht in jeder Objektinstanz.  
  
Ich habe allerdings noch nicht überprüft, in wieweit die von Dir, Peter  
neu vorgestellte Technologie auch auf mein Problem anwenden lässt.  
  
Tipps …?  
  
Gruß  
Olaf