webentwicklung-frage-antwort-db.com.de

Javascript: Modulmuster vs Konstruktor / Prototypmuster?

Ich möchte wissen, ob das Modulmuster oder das Konstruktor-/Prototypmuster für meine Arbeit besser geeignet ist.

Grundsätzlich benutze ich unauffälliges Javascript - das HTML-Dokument hat einen Verweis auf die .js-Datei.

Mein Verständnis des Modulmusters:

  • rufen Sie eine INIT -Methode auf (dies ist im Grunde eine öffentliche Methode, die ich mithilfe des Modulmusters erstellen und zurückgeben kann).
  • Ordnen Sie in der Methode INIT alle Klickereignisse usw. zu.

Das klingt nach dem perfekten Muster für meine Situation, da ich keine Objekte und Vererbungshierarchien usw. erstellen muss.

Mein Verständnis des Konstruktor/Prototyp-Musters:

  • zum Erstellen von Objekten
  • zur Verwendung der Vererbung (d. h. Untertypen eines Supertyps)

Stimmt es, dass für die Bereitstellung von unauffälligem Javascript das Modulmuster ideal ist?

73
Martin

Konstruktorfunktionen und Prototypen sind eine der sinnvollen Möglichkeiten, Klassen und Instanzen zu implementieren. Sie entsprechen nicht ganz diesem Modell, daher müssen Sie normalerweise ein bestimmtes Schema oder eine bestimmte Hilfsmethode auswählen, um Klassen in Form von Prototypen zu implementieren. ( Einige Hintergrundinformationen zu Klassen in JS .)

Das Modulmuster wird normalerweise für Namespaces verwendet, bei denen eine einzelne Instanz als Speicher fungiert, um verwandte Funktionen und Objekte zu gruppieren. Dies ist ein anderer Anwendungsfall als der, für den Prototyping gut ist. Sie konkurrieren nicht wirklich miteinander; Sie können beide sehr gerne zusammen verwenden (z. B. eine Konstruktorfunktion in ein Modul einfügen und new MyNamespace.MyModule.MyClass(arguments) sagen).

68
bobince

Das Modulmuster ist bei weitem einfacher und eleganter als der Prototyp. Allerdings muss man zuerst mobil denken. Es ist kein relevantes Muster für mittlere/große Objekte, da die Initialisierung vor dem Start den gesamten Block analysieren muss. Die mehrfachen Schließungen erzeugen auch kreisförmige Abhängigkeiten, die der Garbage Collector nicht freigibt (insbesondere IE). Dies führt zu einem größeren Speicherbedarf, der erst freigegeben wird, wenn das Fenster (oder der Tabulator) geschlossen wird - überprüfen Sie chrome task) Manager zu vergleichen - Die Ladezeit ist umgekehrt proportional zur Objektgröße unter Verwendung des Modulmusters, während dies bei der prototypischen Vererbung nicht der Fall ist. Die obigen Aussagen werden durch mehrere Benchmarks wie diesen verifiziert: http://jsperf.com/ prototypische Leistung/54

Wie im letzten Test zu sehen. Kleine Objekte sollten besser als einfaches Objekt initialisiert werden (ohne diese Muster). Es eignet sich für einzelne Objekte, die weder geschlossen noch vererbt werden müssen. Es ist ratsam zu prüfen, ob Sie diese Muster überhaupt benötigen.

12
Yann VR

Sie können das Faltmuster ausprobieren, hier ist ein Link: Javascript Faltmuster

Ich habe auch eine Antwort auf eine ähnliche Frage hinterlassen, die zeigt, wie das Faltmuster verwendet wird:

Einfaches Beispiel für ein Faltmuster

5
intrepidis

Das Prototypmuster hilft uns, die Funktionalität zu erweitern, und es gibt nur eine Instanz von Funktionen in einem Speicher, unabhängig von der Anzahl der Objekte. In Module Patter erstellt jedes Objekt eine neue Instanz von Funktionen im Speicher, bietet jedoch ein Konzept für private/öffentliche Variablen und hilft bei der Kapselung der Variablen und Funktionen.

4
user1662008