Als Softwareentwicklungsmodell wurde das monolithische Muster in vielen objektorientierten Sprachen häufig verwendet. In JavaScript wird auch monolithisches Muster häufig verwendet. Da die JavaScript-Sprache jedoch ihre einzigartige objektorientierte Methode hat, steht sie in der Idee der monolithischen Sprachen mit einigen traditionellen objektorientierten Sprachen überein, aber es gibt immer noch Unterschiede in der Implementierung.
Schauen wir uns zunächst die Definition von Monomermustern in herkömmlichen objektorientierten Sprachen an: Monomermuster sind Klassen, die nur einmal instanziiert werden können und über einen bekannten Zugangspunkt zugegriffen werden können. In dieser Definition gibt es zwei Punkte, die die Eigenschaften traditioneller objektorientierter Sprachen hervorheben, nämlich Klasse und Instanziierung. Für traditionelle objektorientierte Sprachen basiert das monolithische Muster daher auf den natürlichen Eigenschaften seiner Klasse und Instanziierung. Das heißt, verwenden Sie die Keyword -Klasse, um eine Klasse zu definieren, die durch das neue Schlüsselwort instanziiert werden kann. Es muss jedoch sichergestellt werden, dass jedes Mal, wenn sie durch neue Instanz instanziiert wird, dieselbe Instanz erhalten wird oder dass sein Konstruktor nur einmal durch neu aufgerufen werden kann.
Schauen wir uns die Definition des Monomermusters in JavaScript an: Monomer ist ein Objekt, mit dem der Namespace teilnehmen und eine Charge von verwandten Methoden und Attributen gemeinsam organisieren. Wenn es instanziiert werden kann, kann es nur einmal instanziiert werden. Wenn Sie die obige Definition verglichen, werden Sie feststellen, dass die Monomerdefinition hier ihre Essenz als Objekt und nicht als Klasse in einer traditionellen objektorientierten Sprache definiert, die auch zeigt, dass die Sprache von JavaScript objektbasiert ist. Gleichzeitig wurde später darauf hingewiesen, dass dies, wenn es instanziiert werden kann, mehrere Möglichkeiten geben sollte, Monomere in JavaScript zu definieren. Es gibt eine oder mehrere Möglichkeiten zum Instanziieren, die so instanziiert werden können, dass sie das neue Schlüsselwort verwenden, um Monomerobjekte zu erstellen. Diese Methode ist jedoch kein natürliches Merkmal von JavaScript selbst, da Objekte, die mit dem neuen Schlüsselwort erstellt wurden, tatsächlich simuliert und durch Funktionen definiert werden (obwohl ES6 begonnen hat, das Schlüsselwort der Klassen zu unterstützen, wurde sie noch nicht weit verbreitet vom Browser). Wie kann ich also die natürlichen Merkmale von JavaScript verwenden, um Monomermuster zu implementieren?
var Singleton = {Attribute1: true, Attribute2: 10, method1: function () {}, method2: function (arg) {}}Hier ist ein Objekt Singleton, das mehrere Eigenschaften und Methoden enthält. Es ist in der Seite enthalten. Dieses Objekt wird erstellt, wenn JS geladen wird. Es wird unter Verwendung von Singleton.method1 beim Anruf aufgerufen. Die Instanziierung wird während der Ausführung der Seite des Ladens von JS -Parsen abgeschlossen. Wir verwenden das neue Schlüsselwort nicht, um dieses Objekt zu instanziieren. Dies ist auch ein großer Unterschied zwischen der Implementierung monolithischer Muster in JavaScript und traditionellen objektorientierten Sprachen. Diese Methode ist einfacher und einfacher zu verstehen. Diese Methode hat jedoch mehrere Nachteile. Ein offensichtlicher Nachteil ist, dass es keinen Namespace angibt. Wenn andere Programmierer auch eine Singleton -Variable auf der Seite definieren, ist es einfach, dieses monolithische Objekt zu überschreiben und zu verwirren. Für dieses Problem wird es also wie folgt umgeschrieben:
var myspace = {}; mySpace.singleton = {Attribute1: true, Attribute2: 10, method1: function () {}, method2: function (arg) {}}Hier wird zuerst ein MySpace -Namespace definiert, und dann ist das Single -Objekt -Singleton unter diesem Objekt montiert, was die Möglichkeit von Konflikten mit anderen Programmierern und Fehloperationen erheblich verringert. Auch wenn andere eine Singleton -Variable im globalen Bereich definieren, verschmutzt sie das Singleton -Objekt nicht. Dies implementiert die Funktion, den Namespace zu teilen und einige verwandte Attribute und Methoden zu organisieren, wie in der vorherigen Definition erwähnt.
Diese Methode hat immer noch ihre Nachteile. Alle Eigenschaften und Methoden dieses monolithischen Objekts werden geteilt und können jederzeit von außen zugegriffen und geändert werden. Daher werden Schließungen verwendet, um private Eigenschaften und Methoden wie folgt zu simulieren:
myspace.singleton = (function () {var privateattribute1 = false; var privateattribute1 = [1,2,3]; privatemethod1 ();Hier weisen wir dem Monolith-Objekt direkt eine anonyme Selbstversorgungsfunktion zu. In dieser Funktion werden die Schlüsselwörter von VAR und Funktion verwendet, um ihre privaten Eigenschaften bzw. Methoden zu definieren. Diese können nicht direkt außerhalb der Funktion (außerhalb des Monolith -Objekts) zugegriffen werden, da nach Ausführung der Funktion der Raum seines internen Bereichs recycelt wird, weshalb Verschlüsse verwendet werden können, um private Eigenschaften und Methoden zu simulieren. In dieser Funktion (Verschluss) wird schließlich ein Objekt zurückgegeben, das einige öffentliche Methoden und Eigenschaften enthält, die direkt außerhalb von außen aufgerufen werden können. Gleichzeitig können diese öffentlichen Methoden in der Funktion definiert werden, sie können ihre privaten Eigenschaften und Methoden aufrufen. Die externe Welt kann jedoch nur bestimmte Operationen durch die zurückgegebenen öffentlichen Methoden und Eigenschaften abschließen und können Eigenschaften wie Singleton.Privatemethod1 nicht direkt aufrufen. Dies macht das monolithische Objekt nicht nur die Außenwelt isoliert, um direkt auf seine privaten Eigenschaften und Methoden zuzugreifen, sondern bietet auch einige gemeinsame Eigenschaften und Methoden für die Außenwelt, um bestimmte Operationen abzuschließen.
Dieses monolithische Muster, das durch die Selbstausführung anonymer Funktionen konstruiert wird, wird in vielen JS-Bibliotheken häufig verwendet, aber es gibt immer noch ein Problem. Wenn wir das Objekt beim Laden der Seite nicht verwenden müssen und die Erstellung des Objekts teurer ist (z. B. viele Berechnungen oder mehrfacher Zugriff auf den DOM -Baum und seine Eigenschaften usw.), ist es vernünftig, es zu erstellen, wenn es benötigt wird, anstatt es direkt mit der Parsen und Ausführung von JS zu erstellen. Dieses Konzept heißt Lazy Loading. Ändern Sie also den obigen Code wie folgt:
myspace.singleton = (function () {var UniqueInstance; Funktion constructor () {var privateatTribute1 = false; var privateattribute1 = [1,2,3]; privateattribute1 = true; }) ();Hier wird eine private Variable UniqueInstance in der anonymen Funktion als Griff definiert, um festzustellen, ob ein monolithisches Objekt erstellt wurde. Anschließend wurden alle auf dem monolithischen Objekt definierten Attribute und Methoden in eine Funktion genannt, die als Konstruktor bezeichnet wird. Nur wenn die Funktion aufgerufen wird, kann das monolithische Objekt erstellt werden, sonst wird sie nicht direkt erstellt. Geben Sie dann ein Objekt zurück, das eine GetInstance -Methode enthält, die für externe Anrufe gilt. Bestimmen Sie beim Aufrufen der Methode zuerst, ob das monolithische Objekt existiert. Wenn es existiert, geben Sie es direkt zurück. Rufen Sie ansonsten die Konstruktorfunktion auf, um das monolithische Objekt zu konstruieren und zurückzugeben. Wenn wir schließlich eine Methode des monolithischen Objekts nennen, müssen wir myspace.singleton.getInstance (). PublicMethod1 () verwenden. Hier erstellen wir dieses monolithische Objekt nur, wenn wir auf diese Weise aufrufen. Andernfalls wird das monolithische Objekt nicht automatisch erstellt, was tatsächlich das Laden von On-Demanden oder faulen Laden implementiert.