Wie rufe ich eine öffentliche Funktion innerhalb einer privaten Funktion im JavaScript-Modulmuster auf?
Zum Beispiel im folgenden Code
%Vor%Diese Frage wurde zweimal vorher , mit jeweils einer anderen akzeptierten Antwort.
Während diese Lösungen funktionieren, sind sie unter OOP-Gesichtspunkten unbefriedigend. Um zu veranschaulichen, was ich meine, nehmen wir eine konkrete Implementierung eines Schneemannes mit jeder dieser Lösungen und vergleichen sie mit einem einfachen Objektliteral.
Schneemann 1: Speichere den Verweis auf das Rückgabeobjekt
%Vor%Schneemann 2: Speichere Verweis auf öffentliche Funktion
%Vor%Schneemann 3: Objektliteral
%Vor%Wir können sehen, dass die drei Funktionen identisch sind und genau die gleichen öffentlichen Methoden haben.
Wenn wir einen Test des einfachen Überschreibens ausführen, jedoch
%Vor%wir sehen, dass # 2 fehlschlägt.
Wenn wir einen Test zum Überschreiben des Prototyps ausführen,
%Vor%wir sehen, dass beide # 1 und # 2 fehlschlagen.
Das ist eine wirklich hässliche Situation. Nur weil ich meinen Code auf die eine oder andere Weise umgestaltet habe, muss der Benutzer des zurückgegebenen Objekts sorgfältig prüfen, wie ich alles implementiert habe, um herauszufinden, ob er die Methoden meines Objekts überschreiben kann und erwartet, dass es funktioniert ! Während sich die Meinungen hier unterscheiden, bin ich der Meinung, dass das korrekte Überschreibungsverhalten das einfache Objektliteral ist.
Also, das ist die eigentliche Frage:
Gibt es eine Möglichkeit, eine öffentliche Methode von einer privaten Methode aufzurufen, sodass das resultierende Objekt in Bezug auf das Überschreibungsverhalten wie ein Objektliteral funktioniert?
Sie können this
verwenden, um das Objekt zu erhalten, für das Ihre privilegierte Methode greet
aufgerufen wurde.
Dann können Sie diesen Wert an Ihre private Methode _sayHello
übergeben, z. mit call
, apply
oder als Argument:
Jetzt können Sie
tun %Vor%Und auch
%Vor%Mit dem Modulmuster verbergen Sie alle Innate eines Objekts in lokalen Variablen / Funktionen, und normalerweise verwenden diese in Ihren öffentlichen Funktionen. Jedes Mal, wenn ein neues Objekt mit einem Modulmuster erstellt wird, wird auch ein neuer Satz von exponierten Funktionen - mit ihrem eigenen Bereichszustand - erstellt.
Mit dem Prototypmuster haben Sie die gleichen Methoden für alle Objekte eines Typs zur Verfügung. Was sich für diese Methoden ändert, ist this
object - mit anderen Worten, das ist ihr Status. Aber this
ist niemals versteckt.
Es ist unnötig zu sagen, dass es schwierig ist, diese zu mischen. Eine Möglichkeit besteht darin, die von privates verwendeten Methoden in einen Prototyp des resultierenden Objekts des Moduls mit Object.create
zu extrahieren. Zum Beispiel:
Tags und Links javascript module-pattern