2016-06-30 11 views
2

Ich folge diesem Link https://addyosmani.com/resources/essentialjsdesignpatterns/book/ Entwurfsmuster in Javascript zu verstehen, habe ich verstanden, Konstruktor Muster, Modulmuster und Modul enthüllt Muster, jetzt in Singleton Muster Ich habe zwei Bedenken, die folgen:Singleton-Entwurfsmuster in Javascript

1) Ich kenne C++ und ich lerne JavaScript jetzt, also verstehe ich Singleton Muster erlaubt Ihnen nur eine Instanz der Klasse, aber in diesem Buch ist es erwähnt "In JavaScript, dienen Singletons als eine gemeinsame Ressource Namespace, die Implementierungscode aus dem globalen Namespace zu isolieren um einen einzigen Zugangspunkt für Funktionen bereitzustellen. " Was heißt das ???

2)

var mySingleton = (function() { 

// Instance stores a reference to the Singleton 
var instance; 

function init() { 

// Singleton 

// Private methods and variables 
function privateMethod(){ 
    console.log("I am private"); 
} 

var privateVariable = "Im also private"; 

var privateRandomNumber = Math.random(); 

return { 

    // Public methods and variables 
    publicMethod: function() { 
    console.log("The public can see me!"); 
    }, 

    publicProperty: "I am also public", 

    getRandomNumber: function() { 
    return privateRandomNumber; 
    } 

}; 

}; 

return { 

// Get the Singleton instance if one exists 
// or create one if it doesn't 
getInstance: function() { 

    if (!instance) { 
    instance = init(); 
    } 

    return instance; 
} 

}; 

})(); 

var singleA = mySingleton.getInstance(); 
var singleB = mySingleton.getInstance(); 

Meine Zweifel ist, wenn wir mySingleton.getInstance nennen(); Der Wert "Instanz" ist nicht wieder definiert, da es sich um eine lokale Variable handelt und bei jedem Aufruf der getInstance-Methode der Instanzwert als undefined und damit falls (! instance)
immer passieren sollte und ein neues geben soll Beispiel, aber ich verstehe nicht, wie es hier funktioniert. Bitte erkläre es.

+0

aufgrund zugreifen können. (nicht im Bereich der 'getInstance'-Funktion) –

+0

Mein Rat ist, nachzuschauen, welche Verschlüsse in Javascript sind. –

+0

Danke Punkt 2 ist jetzt klar ... aber was ist mit Punkt Nr. 1? Bitte erklären Sie ... – user3651606

Antwort

0

1) Dies bedeutet, dass nur die Variable var mySingleton jetzt vom globalen Namespace aus zugänglich ist. Es wird die einzige öffentliche Methode getInstance verfügbar gemacht, die nur eine Instanz einer Klasse zurückgibt (der Code, der für die Verwaltung der privaten Referenz auf diese Instanz zuständig ist, ist außerhalb des Gültigkeitsbereichs verborgen).

2) Nein, var instance ist im "äußeren" Bereich definiert. (Nicht im Rahmen der getInstance Funktion)

0

var mySingleton ist eine IIFE Funktion und dies bringt Sie ein Objekt (oder in Modul enthüllt Muster Begriff, setzt Eigenschaft getInstance)

Jedes Mal mySingleton bezeichnet wird Im Code wird der darin enthaltene Inhalt jedes Mal ausgeführt. Daher wird die Instanzvariable zurückgesetzt. Hinweis, init Methode gibt auch ein Objekt mit 3 Eigenschaften zurück, was darauf hinweist, dass diese auch belichtbar sind (können öffentlich gemacht werden und sogar die privaten Variablen können öffentlich gemacht werden, indem sie in einer öffentlichen Funktion verarbeitet werden. So ziemlich die C++/Java-Konzepte).

Am Ende nutzen wir diese init() und markieren es

daher GetInstance wenn ich var = mySingleton.getInstance der Singles tun(); var singleB = mySingleton.getInstance();

Ich kann auf die (selektiv) "exposed" Eigenschaften singleA zugreifen.publicMethod()

Fluss: der Singles [bezeichnet] getInstance() [ausgesetzt durch] mySingleton [und] getInstance() [bezeichnet] init() [die aussetzt] publicMethod, Volkseigentum und getRandomNumber [die Sie indirekt ermöglicht den Zugriff auf] privateRandomNumber

Zweifel # 1 Dienen als Namespace für gemeinsam genutzte Ressourcen und verbergen die Codeimplementierung. Es teilt die privaten Eigenschaften und Methoden der Init-Methode global auf, während Sie sich in einem Namespace 1 über Init befinden.

Private Methoden sind versteckt und nicht exponiert.

Zweifel # 2 Jedes Mal, wenn mySingleton aufgerufen wird, wird die Instanz erneut deklariert.

this helps

0

In JavaScript-Objekt ein Datenreferenztyp ist, das bedeutet, dass die Instanz hier wieder gleich ist.

var singleA = mySingleton.getInstance(); 
var singleB = mySingleton.getInstance(); 

singleA === singleB // > true 

und die Tatsache, dass wir die Instanz-Variable in getInstance Funktion von mySingleton ist die bis zum Abschluss, `var instance` in„äußere“Bereich definiert No