Javascript Modul Pattern und das neue Schlüsselwort

8

Ich bekomme die Grundlagen des Modulmusters und seine Verwendung eines Abschlusses, um private Mitglieder zu erlauben, ABER ich kann nicht ganz schlucken, warum der folgende Code das tut, was er tut:

%Vor%

Die Konsolenausgabe ist

%Vor%

Wenn Sie hier das Schlüsselwort new absichtlich weglassen, wird mit dem ersten Aufruf myCalc auf ein Calculator-Objekt gesetzt. Es beginnt mit einem priv -Wert von 0, ist inkrementiert und gibt dann seinen neuen priv -Wert von 1 aus.

Aber a) WARUM gibt der nächste Aufruf von Calculator() einen Verweis auf das SAME-Objekt zurück (wie durch die zweite "1" belegt)? Ich weiß, dass ich hier new verwenden kann und das vermeide, aber verstehe nicht, warum ich muss. Funktioniert diese Funktion nicht mithilfe der Objektliteralsyntax, um im Wesentlichen ein neues Objekt zu erstellen und es dann zurückzugeben? b) Da es scheint, dass es den gleichen Funktionsstapelraum verwendet (ist das sogar der richtige Weg, um es in JS zu denken?), warum löscht es nicht die Variable priv im Prozess vor dem Zurückgeben der Referenz an das gleiche Objekt?

BEARBEITEN: Korrigierter schlampiger / blöder Fehler (danke Prozessor), der nun ein neues / unterschiedliches Taschenrechnerobjekt auch ohne Verwendung des new Schlüsselwortes ausgibt. Damit klärt sich a) und b) auf. Meine resultierende Frage wäre gewesen "Ist es wichtig, ob ich new oder nicht im Aufruf eines Modulmusterkonstruktors verwende. Die Antwort ist, ich denke, es ist egal (?). (Joseph: siehe Ссылка ... der Operator instanceof arbeitet einfach nicht mit dem Modulmuster.

    
jeffersii 18.04.2012, 05:51
quelle

3 Antworten

8

Sie geben den anderen Rechner myOtherCalc nicht aus: Wenn Sie sie vergleichen möchten, ersetzen Sie das dritte myCalc.printPriv(); durch:

%Vor%

Dann ist die Ausgabe:

%Vor%     
scessor 18.04.2012, 05:54
quelle
3

Sie müssen in Ihrem Fall nicht new verwenden.

Wenn Sie new verwenden, erwarten Sie normalerweise, dass Sie eine Instanz des von Ihnen aufgerufenen Konstruktors erhalten. In Ihrem Fall wird es nicht, weil Sie ein Objekt manuell zurückgegeben haben. Es würde keinen Sinn ergeben und später zu Problemen führen, die den Gebrauch verwirren. Bald könnten Sie Ihre Objekte "instanziieren" und auf diese "Nichtübereinstimmung" stoßen.

und Sie haben einen Tippfehler in Ihrem Code:

%Vor%     
Joseph 18.04.2012 06:27
quelle
0

Es hat nichts mit dem "neuen" Operator zu tun ... Hier erhalten Sie ein gut erklärtes Thema über Proto / Konstruktor: Ссылка

Es ist jedoch ein Nonsense-Beispiel, das Sie tun können, so dass Sie nur über Getter- und Setter-Methoden auf priv zugreifen können:

%Vor%

In diesem Fall ist var priv immer über eine Getter- und Setter-Methode zugänglich,

Im nächsten Beispiel haben Sie eine private var Klassenname und eine andere öffentliche Variable __className:

%Vor%

// Skript:     var SomeClass = function (Klassenname) {

%Vor%

// Deklaration beenden.

// Tests:

%Vor%

// beendet den Javascript- und CDATA-Abschnitt

%Vor%

Ausgabe in "div: outputDiv":

"öffentlicher Standardklassenname"

Eine neue Instanz von "private [ Klassenname ]: foo" wurde erstellt. Verweise auf [ Klassenname ] Eine neue Instanz von "public default className" wurde erstellt. Verweise auf [this. Klassenname ]

[Objekt HTMLDivElement]

"Irgendein Name"

Eine neue Instanz von "private [ Klassenname ]: foo" wurde erstellt. Verweise auf [ Klassenname ] Eine neue Instanz von "Some name" wurde erstellt. Verweise auf [this. Klassenname ]

bar

Eine neue Instanz von "private [ Klassenname ]: foo" wurde erstellt. Verweise auf [ Klassenname ] Eine neue Instanz der Leiste wurde erstellt. Verweise auf [this. Klassenname ]

- & gt; Klassenname , der im Konstruktor deklariert ist, ändert sich nie! - & gt; dies. Klassenname oder SomeClass.prototype. Klassenname ist öffentlich und kann geändert werden.

Ich hoffe, dass dies hilft, die Kette und meinen Kommentar klarer zu verstehen ...

    
tatactic 18.04.2012 07:05
quelle