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.
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%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 ...
Tags und Links javascript new-operator closures module-pattern