molily: Zugriff aus privater Methode in Prototype-Objekt auf this?

Beitrag lesen

Foo.prototype = new function() {
    var that = this;
    var getSpecialId = function() {
        return that.getId() + 1;
    }
    this.showSpecialId = function() {
        alert(getSpecialId());
    }
}

Allerdings bezieht sich jetzt wohl „that“ in getSpecialId() ausschließlich auf Foo.prototype

Ja, das ist ganz logisch.
Du rufst eine Funktion mit new auf. Es wird ein leeres Object erzeugt. In der Funktion legst du lokale Variablen an (that, getSpecialId). Dem Object fügst du nun eine Methode hinzu. Die Rückgabe des Funktionsaufrufs speicherst du in Foo.prototype. Das heißt nun: Alle Instanzen von Foo haben eine Methode showSpecialId. Darin hast du Zugriff auf that (zeigt auf Foo.prototype) und getSpecialId.

Ist es möglich, in privaten Methoden innerhalb von Foo.prototype auf Methoden oder Eigenschaften von Foo zuzugreifen?

Das Prototyp-Objekt hat mit den Instanzen nichts zu tun, eine Verbindung besteht erst einmal nicht. Die einzige Verbindung besteht darin, dass die Methoden aus dem Prototyp-Objekt an die Instanz kopiert werden. Dann sind sie dessen Unterobjekte, können über instanz.methode() aufgerufen werden und this zeigt wie gewünscht auf die Instanz (alleine wegen dieser Unterobjekt-Beziehung und alleine wegen dieses Aufrufs).

Ich wüsste daher nicht, wie du beim Anlegen des Prototyp-Objekts in der mit new aufgerufenen Funktion an die Instanz herankommst. Die einzige Stelle, wo du auf das Instanzobjekt Zugriff hast, ist in der öffentlichen Funktion. Jetzt kannst höchstens folgendes tun:

privateMethode(this) // Instanzobjekt übergeben
privateMethode.call(this) // Im Kontext der Instanz ausführen

Aber ich frage mich, warum du nicht die klassische Schreibweise ohne Prototyp-Objekt wählst, um private Member zu emulieren:

function Konstruktor () {  
   var instanz = this;  
   var privateMethode = function () { alert(instanz); };  
   this.öffentlicheMethode = function () { privateMethode(); };  
}

Hier hast du Zugriff auf die Instanz und kannst eine Referenz darauf anlegen, die durch den Closure-Effekt in der privaten Methode verfügbar ist. Das hat natürlich seine Nachteile, u.a. wird die Methode immer neu angelegt, aber es löst zumindest dein Problem.

Mathias