Ich verwalte alten Code und habe festgestellt, dass das folgende Muster zum Definieren von Objekten verwendet wird:
var MyObject = {};
(function (root) {
root.myFunction = function (foo) {
//do something
};
})(MyObject);
Hat das einen Zweck? Ist es gleichbedeutend damit, nur Folgendes zu tun?
var MyObject = {
myFunction : function (foo) {
//do something
};
};
Ich bin nicht im Begriff, mich auf eine heilige Suche zu begeben, um die gesamte Codebasis nach meinen Wünschen umzugestalten, aber ich möchte wirklich den Grund für diese Art der Definition von Objekten verstehen.
Vielen Dank!
javascript
javascript-objects
Sebastián Vansteenkiste
quelle
quelle
myFunction
einige außerhalb von sich selbst definierte Variablen verwendet werden könnten , auf die von außen nicht zugegriffen werden kann . Siehe meine AntwortAntworten:
Es heißt das Modulmuster http://toddmotto.com/mastering-the-module-pattern/
Der Hauptgrund ist, dass Sie wirklich private Methoden und Variablen erstellen. In Ihrem Fall ist dies nicht aussagekräftig, da keine Implementierungsdetails ausgeblendet werden.
Hier ist ein Beispiel, in dem es sinnvoll ist, das Modulmuster zu verwenden.
Wenn Sie nur ein gerades Objekt verwenden
adder
undvalue
öffentlich werden würdenUnd Sie könnten es brechen, indem Sie Dinge wie tun
Aber mit der Modulversion
quelle
ns.getNext: function () {
wird nicht kompiliert.delete MyNameSpace.getNext
.:)
Der Zweck besteht darin, die Zugänglichkeit von Funktionen innerhalb des Abschlusses zu beschränken, um zu verhindern, dass andere Skripte Code darauf ausführen. Durch Wickeln um eine Schließung Sie Neudefinition der Umfang der Ausführung für alle Code innerhalb des Verschlusses und effektiv einen privaten Rahmen zu schaffen. Weitere Informationen finden Sie in diesem Artikel:
http://lupomontero.com/using-javascript-closures-to-create-private-scopes/
Aus dem Artikel:
Code:
quelle
myFunction
ist in der zweiten Version nicht im globalen Bereich. Der Zweck besteht tatsächlich darin, einen Bereich bereitzustellen, in dem interne Hilfsfunktionen definiert werden können.myFunction
befindet sich im globalen Bereich, da es im globalen Objekt definiert istmyObject
. In der zweiten Version kann jeder andere Code in der Anwendung ausgeführt werdenmyFunction
. In der ersten Version hat nur Code innerhalb der Schließung Zugriff aufmyFunction
myFunction
kann nurMyObject.myFunction()
wie die erste Version ausgeführt werden.Vorteile:
verwaltet Variablen im privaten Bereich.
Sie können die Funktionalität des vorhandenen Objekts erweitern.
Leistung wird erhöht.
Ich denke, die obigen drei einfachen Punkte sind gerade genug, um diesen Regeln zu folgen. Und um es einfach zu halten, ist es nichts anderes als das Schreiben innerer Funktionen.
quelle
In dem von Ihnen gezeigten speziellen Fall gibt es keinen bedeutenden Unterschied in Bezug auf Funktionalität oder Sichtbarkeit.
Es ist wahrscheinlich, dass der ursprüngliche Codierer diesen Ansatz als eine Art Vorlage verwendet hat, mit der er private Variablen definieren kann, die bei der Definition von Dingen wie
myFunction
:Dies vermeidet die Berechnung bei
seconds_per_day
jedem Aufruf der Funktion und verhindert gleichzeitig, dass der globale Bereich verschmutzt wird.Es gibt jedoch nichts wesentlich anderes als nur zu sagen
Der ursprüngliche Codierer hat es möglicherweise vorgezogen, Funktionen zum Objekt mit der deklarativen Syntax von
root.myFunction = function
und nicht mit der Objekt- / Eigenschaftssyntax von hinzufügen zu könnenmyFunction: function
. Dieser Unterschied ist jedoch hauptsächlich eine Frage der Präferenz.Die vom ursprünglichen Codierer verwendete Struktur hat jedoch den Vorteil, dass Eigenschaften / Methoden leicht an anderer Stelle im Code hinzugefügt werden können:
Unterm Strich müssen Sie diesen Ansatz nicht anwenden, wenn Sie ihn nicht benötigen, aber Sie müssen ihn auch nicht ändern, da er einwandfrei funktioniert und tatsächlich einige Vorteile bietet.
quelle
Das erste Muster kann als Modul verwendet werden, das ein Objekt nimmt und dieses Objekt mit einigen Änderungen zurückgibt. Mit anderen Worten, Sie können solche Module wie folgt definieren.
Und benutze es wie:
Ein Vorteil könnte also die Wiederverwendbarkeit dieses Moduls für spätere Verwendungen sein.
Im ersten Muster können Sie einen privaten Bereich definieren, in dem Ihre privaten Daten wie private Eigenschaften und Methoden gespeichert werden. Betrachten Sie zum Beispiel dieses Snippet:
Dieses Muster kann verwendet werden, um allen Objekttypen wie Arrays, Objektliteralen und Funktionen eine Methode oder Eigenschaft hinzuzufügen.
Meiner Meinung nach könnte der Hauptvorteil der zweite sein (Schaffung eines privaten Bereichs)
quelle
Dieses Muster bietet einen Bereich, in dem Sie Hilfsfunktionen definieren können, die im globalen Bereich nicht sichtbar sind:
doFoo
ist lokal für die anonyme Funktion und kann von außen nicht referenziert werden.quelle