Je maintiens du code hérité et j'ai remarqué que le modèle suivant pour définir les objets est utilisé:
var MyObject = {};
(function (root) {
root.myFunction = function (foo) {
//do something
};
})(MyObject);
Y a-t-il un but à cela? Est-ce équivalent à simplement faire ce qui suit?
var MyObject = {
myFunction : function (foo) {
//do something
};
};
Je ne suis pas sur le point de me lancer dans une quête sacrée pour refactoriser l'ensemble de la base de code à mon goût, mais j'aimerais vraiment comprendre la raison de cette façon détournée de définir les objets.
Merci!
javascript
javascript-objects
Sebastián Vansteenkiste
la source
la source
myFunction
pourrait utiliser des variables définies en dehors de lui-même qui ne seraient pas accessibles de l'extérieur. Voir ma réponseRéponses:
Il s'appelle le modèle de module http://toddmotto.com/mastering-the-module-pattern/
La principale raison est que vous créez des méthodes et des variables vraiment privées. Dans votre cas, cela n'a pas de sens car cela ne cache aucun détail d'implémentation.
Voici un exemple où il est logique d'utiliser le modèle de module.
Alors que si vous utilisiez simplement un objet simple
adder
etvalue
deviendriez publicEt tu pourrais le casser en faisant des trucs comme
Mais avec la version du module
la source
ns.getNext: function () {
ne compilera pas.delete MyNameSpace.getNext
.:)
Le but est de limiter l' accessibilité des fonctions au sein de la fermeture pour aider à empêcher d'autres scripts d'exécuter du code dessus. En l'enveloppant autour d'une fermeture, vous redéfinissez la portée d'exécution de tout le code à l'intérieur de la fermeture et créez efficacement une portée privée. Consultez cet article pour plus d'informations:
http://lupomontero.com/using-javascript-closures-to-create-private-scopes/
De l'article:
Code:
la source
myFunction
n'est pas dans la portée globale de la deuxième version. Le but est en fait de fournir une portée où les fonctions auxiliaires internes pourraient être définies.myFunction
est dans la portée globale car elle est définie dans l'objet globalmyObject
. Dans la deuxième version, tout autre code de l'application pouvait s'exécutermyFunction
. Dans la première version, seul le code de la fermeture a accès àmyFunction
myFunction
ne peut être exécuté queMyObject.myFunction()
comme la première version.avantages:
maintient les variables à portée privée.
vous pouvez étendre les fonctionnalités de l'objet existant.
les performances sont augmentées.
Je pense que les trois points simples ci-dessus sont juste suffisants pour suivre ces règles. Et pour rester simple, il ne s'agit que d'écrire des fonctions internes.
la source
Dans le cas particulier que vous montrez, il n'y a pas de différence significative, en termes de fonctionnalité ou de visibilité.
Il est probable que le codeur d'origine ait adopté cette approche comme une sorte de modèle lui permettant de définir des variables privées qui pourraient être utilisées dans la définition de choses comme
myFunction
:Cela évite de calculer à
seconds_per_day
chaque appel de la fonction, tout en l'empêchant de polluer la portée globale.Cependant, il n'y a rien de fondamentalement différent de cela et de dire simplement
Le codeur d'origine a peut-être préféré pouvoir ajouter des fonctions à l'objet en utilisant la syntaxe déclarative de
root.myFunction = function
plutôt que la syntaxe objet / propriété demyFunction: function
. Mais cette différence est principalement une question de préférence.Cependant, la structure prise par le codeur d'origine a l'avantage que les propriétés / méthodes peuvent être facilement ajoutées ailleurs dans le code:
En fin de compte, il n'est pas nécessaire d'adopter cette approche si vous n'en avez pas besoin, mais il n'est pas non plus nécessaire de la changer, car elle fonctionne parfaitement bien et présente en fait certains avantages.
la source
Le premier modèle peut être utilisé comme un module qui prend un objet et renvoie cet objet avec quelques modifications. En d'autres termes, vous pouvez définir ces modules comme suit.
Et utilisez-le comme:
Un avantage pourrait donc être la réutilisation de ce module pour des utilisations ultérieures.
Dans le premier modèle, vous pouvez définir une étendue privée pour stocker vos données privées telles que des propriétés et des méthodes privées. Par exemple, considérez cet extrait de code:
Ce modèle peut être utilisé pour ajouter une méthode ou une propriété à tous les types d'objets tels que des tableaux, des littéraux d'objet, des fonctions.
À mon avis, le principal avantage pourrait être le deuxième (création d'un périmètre privé)
la source
Ce modèle fournit une portée dans laquelle vous pouvez définir des fonctions d'assistance qui ne sont pas visibles dans la portée globale:
doFoo
est local à la fonction anonyme, il ne peut pas être référencé de l'extérieur.la source