2016-12-30 4 views
0

Dies ist mein modifiziertes Beispiel basierend auf one by Rob Dodson.Wie funktioniert das JavaScript-Singleton-Muster mit zwischengespeicherten statischen Eigenschaften?

function User() { 
    // do we have an existing instance? 
    if (User.instance) { 
     return User.instance; 
    } 

    // proceed as normal 
    this.firstName = 'John'; 
    this.lastName = 'Doe'; 

    // cache 
    User.instance = this; 

    // implicit return 
    // return this; 
} 

a = new User(); 
b = new User(); 
b.firstName = "Paul" 
console.log(a) 

Ich lerne gerade, so kann ich Terminologie legen, aber wenn ich richtig verstehe, User.instance = this; Klone User, und dass Klon wird der einzige User wir Zugang zu mehr haben. So ist der vollständige Prozess durch geht, ist wie folgt:

a = new User();

tun wir haben eine bestehende User.instance? Nein, also fahre fort mit dem Code und setze a.firstName auf John und a.lastName auf Doe. Und nun erstellen Sie eine Kopie des this Objekts mit dem Namen John Doe und legen Sie es als permanenten Teil des User Konstruktors fest. Was macht es dauerhaft? Weil der Code niemals die Zeile erreichen wird, die er wieder einstellt. Warum? Weil ...

b = new User();

haben wir eine bestehende User.instance? Ja. So return die User.instance haben wir bereits gespeichert, und bewegen sich wieder aus der Funktion.

Wie bezieht sich a auf User.instance? - Ich sehe nicht, wie die implizite Rückkehr von this ist, was zu a zurückkehrt - wo mit b ist es der Klon.

+0

Funktionen können auch Eigenschaften haben, so dass das Setzen von 'User.instance = this;' das zuerst erzeugte Unvermögen auf die Funktion selbst speichert. Wenn es erneut aufgerufen wird, erkennt es seine Instanzeigenschaft und gibt die zwischengespeicherte Instanz zurück. Und b ist kein Klon, es ist eine Referenz auf das gleiche Objekt, auf das Bezug genommen wird. Wenn Sie also b.firstName in paul ändern, ist a.firstName auch paul. – Shilly

Antwort

1

wenn ich das richtig, User.instance = this; Klone Benutzer verstehen, und dass Klon wird ...
... eine Kopie dieses Objekts machen ...

No. Belegung nicht kopieren/Klon-Objekte, tut es zuweisen die derselbe Objektverweis von der rechten Seite zu der Variablen (oder der Eigenschaft usw.) auf der linken Seite. Deshalb a === User.instance und b = User.instance.

Das gleiche passiert in b = new User(); - der Rückgabewert von new User() ist nicht geklont oder etwas, aber direkt zugeordnet b.

+0

Was ist mit 'a = new User();'? Warum sollte der Rückgabewert beim ersten Mal nicht undefiniert sein? – stephen

+0

Da Konstruktoren, die mit 'new' aufgerufen werden, implizit die Instanz zurückgeben, wie der Kommentar in Ihrem Code erwähnt – Bergi

Verwandte Themen