Wie rufe ich eine öffentliche Funktion innerhalb einer privaten Funktion im JavaScript-Modulmuster auf?

8

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.

  1. Speichern Sie einen Verweis auf das Rückgabeobjekt, bevor Sie es zurückgeben, und verwenden Sie dann diesen Verweis, um auf die öffentliche Methode zuzugreifen. Siehe Antwort .
  2. Speichern Sie einen Verweis auf die öffentliche Methode in der Closure, und verwenden Sie diese, um auf die öffentliche Methode zuzugreifen. Siehe 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?

    
I-Lin Kuo 20.12.2014, 22:44
quelle

2 Antworten

2

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:

%Vor%

Jetzt können Sie

tun %Vor%

Und auch

%Vor%     
Oriol 20.12.2014 23:38
quelle
1

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:

%Vor%     
raina77ow 20.12.2014 23:39
quelle

Tags und Links