einführen
Ab diesem Kapitel werden wir nach und nach die verschiedenen in JavaScript verwendeten Entwurfsmuster -Implementierungen einführen. Hier werde ich nicht zu viel Theorien des Musters selbst einführen, sondern nur auf die Implementierung. Ok, fange offiziell an.
In den Augen traditioneller Entwicklungsingenieure soll ein Singleton sicherstellen, dass es nur eine Instanz einer Klasse gibt. Die Implementierungsmethode besteht im Allgemeinen darin, zuerst zu bestimmen, ob die Instanz existiert oder nicht. Wenn es existiert, wird es direkt zurückgegeben, und wenn es nicht existiert, wird es erstellt und dann zurückgegeben, was sicherstellt, dass es nur ein Instanzobjekt einer Klasse gibt. In JavaScript fungiert Singleton als Namespace -Anbieter und bietet einen eindeutigen Zugangspunkt aus dem globalen Namespace, um auf das Objekt zuzugreifen.
Text
In JavaScript gibt es viele Möglichkeiten, Singletons zu implementieren. Der einfachste Weg ist die Verwendung des wörtlichen Objekts, das eine große Anzahl von Eigenschaften und Methoden enthalten kann:
Die Codekopie lautet wie folgt:
var mysingleton = {
Eigentum1: "Etwas",
Eigentum2: "Etwas anderes",
Methode1: function () {
console.log ('Hallo Welt');
}
};
Wenn Sie das Objekt später erweitern möchten, können Sie Ihre eigenen privaten Mitglieder und Methoden hinzufügen und dann einen Verschluss verwenden, um diese Variablen und Funktionserklärungen darin zu verkapulieren. Nur die öffentlichen Mitglieder und Methoden, die Sie aufdecken möchten, sind entlarvt. Der Beispielcode lautet wie folgt:
Die Codekopie lautet wie folgt:
var mysingleton = function () {
/* Hier private Variablen und Methoden hier deklarieren*/
var privatevariable = 'etwas Privates';
Funktion showPrivate () {
console.log (privatVariable);
}
/ * Öffentliche Variablen und Methoden (private Variablen und Methoden können zugegriffen werden) *//
zurückkehren {
PublicMethod: function () {
ShowPrivate ();
},
Publicvar: "Die Öffentlichkeit kann das sehen!"
};
};
var Single = mysingleton ();
Single.PublicMethod (); // etwas privates ausgeben '
console.log (Single.Publicvar); // Ausgabe 'Die Öffentlichkeit kann das sehen!'
Der obige Code ist ziemlich gut, aber was ist, wenn wir es nur initialisieren wollen, wenn wir ihn verwenden? Um Ressourcen zu sparen, können wir diese Codes in einem anderen Konstruktor initialisieren, wie folgt:
Die Codekopie lautet wie folgt:
var Singleton = (function () {
var instanziiert;
Funktion init () {
/*Definieren Sie den Singleton -Code hier*//
zurückkehren {
PublicMethod: function () {
console.log ('Hallo Welt');
},
PublicProperty: "Test"
};
}
zurückkehren {
GetInstance: function () {
if (! instanziiert) {
instanziiert = init ();
}
Instanziiert zurückkehren;
}
};
}) ();
/*Eine öffentliche Methode rufen, um die Instanz zu erhalten:*/
Singleton.getInstance (). PublicMethod ();
Ich weiß, wie man Singletons implementiert, aber welche Art von Szenario ist das beste Szenario für Singletons? Tatsächlich werden Singletons im Allgemeinen für die Kommunikationskoordination zwischen verschiedenen Modi zwischen Systemen verwendet. Der folgende Code ist die beste Praxis für einen Singleton:
Die Codekopie lautet wie folgt:
var Singletontester = (function () {
// Parameter: Eine Reihe von Parametern, die an ein Singleton übergeben wurden
Funktion Singleton (args) {
// Setzen Sie die Args -Variable auf den empfangenen Parameter oder sind Sie leer (falls nicht angegeben).
var args = args || {};
// Namensparameter festlegen
this.name = 'Singletontester';
// Legen Sie den Wert von PointX ein
this.pointX = args.pointx || 6; // Holen Sie sich die empfangenen Parameter oder auf den Standardwert fest
// Legen Sie den Wert von Spoty fest
this.pointy = args.Pointy || 10;
}
// Instanzbehälter
var Instance;
var _static = {
Name: 'Singletontester',
// Methode, um Instanz zu erhalten
// Geben Sie die Singleton -Instanz zurück
GetInstance: Funktion (args) {
if (instance === undefiniert) {
Instance = New Singleton (Args);
}
Rückkehrinstanz;
}
};
Rückgabe _Static;
}) ();
var Singletontest = SingletonTester.getInstance ({pointX: 5});
console.log (Singletontest.PointX); // Ausgabe 5
Andere Implementierungsmethoden
Methode 1:
Die Codekopie lautet wie folgt:
Funktion Universe () {
// Bestimmen Sie, ob es eine Instanz gibt
if (typeof Universe.instance === 'Objekt') {
Return Universe.instance;
}
// andere Inhalte
this.start_time = 0;
this.bang = "big";
// Cache
Universum.instance = this;
// geben dies implizit zurück
}
// prüfen
var uni = new Universe ();
var uni2 = neues Universum ();
console.log (uni === uni2); // WAHR
Methode 2:
Die Codekopie lautet wie folgt:
Funktion Universe () {
// Cache -Instanz
var instance = this;
// andere Inhalte
this.start_time = 0;
this.bang = "big";
// den Konstruktor umschreiben
Universe = function () {
Rückkehrinstanz;
};
}
// prüfen
var uni = new Universe ();
var uni2 = neues Universum ();
Uni.bang = "123";
console.log (uni === uni2); // WAHR
console.log (uni2.bang); // 123
Methode 3:
Die Codekopie lautet wie folgt:
Funktion Universe () {
// Cache -Instanz
var Instance;
// die Funktion rekonstruieren
Universe = Funktion Universe () {
Rückkehrinstanz;
};
// Nachverarbeitung der Prototypeigenschaften nach der Verarbeitung
Universe.Prototype = this;
// Beispiel
Instance = New Universe ();
// Setzen Sie den Konstruktorzeiger zurück
Instance.Constructor = Universe;
// andere Funktionen
instance.start_time = 0;
Instance.bang = "Big";
Rückkehrinstanz;
}
// prüfen
var uni = new Universe ();
var uni2 = neues Universum ();
console.log (uni === uni2); // WAHR
// Prototyp -Eigenschaften hinzufügen
Universe.Prototype.Nothing = true;
var uni = new Universe ();
Universum.Prototype.Everything = wahr;
var uni2 = neues Universum ();
console.log (uni.nothing); // WAHR
console.log (uni2.Nothing); // WAHR
console.log (uni.jalything); // WAHR
console.log (uni2.ywhything); // WAHR
console.log (uni.constructor === Universum); // WAHR
Methode 4:
Die Codekopie lautet wie folgt:
var Universum;
(function () {
var Instance;
Universe = Funktion Universe () {
if (Instanz) {
Rückkehrinstanz;
}
Instance = this;
// andere Inhalte
this.start_time = 0;
this.bang = "big";
};
} ());
// Testcode
var a = neues Universum ();
var b = neues Universum ();
alarm (a === b); // WAHR
A. Bang = "123";
Alarm (B.Bang); // 123