Ich habe diese mit der Hilfe von anderen und mehreren Ressourcen zusammengefügt. Ich habe eine Geige von allem gemacht, und der abgespeckte Code ist unten veröffentlicht.
Grundsätzlich habe ich gelernt, jedes dieser Muster zu verwenden, aber ich bin neugierig auf die grundlegenderen Unterschiede zwischen diesen Ansätzen. Downstream-Code ist praktisch identisch mit jedem dieser Muster, aber gibt es einen Grund, warum man einen über einen anderen verwenden sollte, jenseits persönlicher Vorlieben? Auch wenn ich versucht habe, die gängigsten Muster aufzuspüren, bitte schlagen Sie Ihre eigenen vor, wenn es besser ist.
Muster 1 (objektbasiert):
%Vor%Muster 2 (Am meisten traditionell, soweit ich weiß):
%Vor%Muster 3 (Verwendung der Schließung):
%Vor%Muster 1 ist ein Singleton. Wenn Sie nur ein solches Objekt benötigen, ist es in Ordnung.
Muster 2 erstellt neue Objekte und nutzt das prototype
-Objekt, so dass beim Erstellen eines neuen MouseDiff
-Objekts keine neuen Kopien der Funktionen (die selbst Daten in JavaScript sind) erstellt werden.
Muster 3 benötigt mehr Speicher im Vergleich zu einem normalen Singleton, bietet aber statische Privatsphäre.
Ich mag das folgende Muster, da es verschiedene Merkmale abdeckt, obwohl es in Wirklichkeit eine Kombination aus Konstruktor (Muster 2) und Schluss (Muster 3) ist:
%Vor%Ich weiß nicht genug über JavaScript, um Ihnen sagen zu können, ob Leistungsdifferenzen zwischen diesen Ansätzen bestehen. Hier sind nur zwei Unterschiede zwischen diesen, die ich bemerkt habe. Ich bin sicher, dass es andere gibt.
Muster 1 erstellt ein Objekt mit diesen Eigenschaften, einschließlich angehängter Methoden. Mit Muster 2 können wir problemlos viele Objekte mit denselben Methoden erstellen, ohne sie neu zu schreiben.
Muster 3 ist wie eine Fabrik. Anstatt sich auf einen Prototyp zu verlassen, um diese Methoden automatisch anzuhängen, erstellt die Factory sie einfach neu und gibt das Objekt zurück. Die Verwendung einer Schließung ermöglicht es uns, die "Member-Variablen" des Objekts zu verbergen. Es gibt keine Möglichkeit, auf startPoint
oder hypotenuse()
zuzugreifen, außer über die zurückgegebene "public" -Schnittstelle.
Immer wenn ich diese Art von theoretischen JavaScript-Fragen beantworte, befürchte ich immer, dass es ein technisches Detail gibt, das ich vergesse oder vergesse. Wenn ja, lass es mich wissen, und ich werde die Antwort reparieren.
Ссылка ist ziemlich gut für oop in Js. Wenn Sie private, protected, public variable und function sowie Vererbung angeben. Beispielcode:
%Vor%Dies wurde schon oft anderswo beantwortet, aber nur um Abwechslung zu bieten. ds.oop ist eine gute Möglichkeit, Klassen mit Konstruktoren in Javascript zu deklarieren. Es unterstützt jeden möglichen Typ der Vererbung (einschließlich 1 Typ, den auch c # nicht unterstützt) sowie Interfaces, was nett ist.
%Vor%Muster zwei ist meine persönliche Vorliebe, weil es der traditionellen objektorientierten Programmierung am nächsten kommt und eine einfache Vererbung ermöglicht.
Dieser Beitrag von John Resig (der Typ hinter JQuery) benutzt diese Methode ... Ссылка
[Bearbeiten]
Tatsächlich glaube ich nicht, dass die Methoden 1 oder 3 Vorteile haben. 1 ist, wie jemand anders sagte, ein Singleton und erlaubt nicht mehrere Instanzen und 3 ... Ich weiß nicht, wo ich mit 3 anfangen soll.
Es gibt einen weiteren möglichen Weg, dies zu tun.
%Vor% Hier übergeben wir einfach den Namespace als Argument an eine selbstaufrufende Funktion. Die Variable privateVarialble
ist privat, da sie dem Kontext nicht zugewiesen wird.
Wir können den Kontext sogar auf das globale Objekt setzen (mit einer Ein-Wort-Änderung!). In Klammern (MouseDiff)
wird (this)
angezeigt. Dies ist ein großer Vorteil für Bibliotheksanbieter, die ihre Funktionen in eine selbstaufrufende Funktion einbinden können und es dem Benutzer überlassen, ob sie global sein sollen oder nicht.
Tags und Links javascript model-view-controller design-patterns oop