Le modèle de module a été initialement défini comme un moyen de fournir à la fois l'encapsulation privée et publique pour les classes en génie logiciel conventionnel.
Lorsque vous travaillez avec le modèle de module, nous pouvons trouver utile de définir un modèle simple que nous utilisons pour commencer à l'utiliser. En voici une qui couvre l'espacement des noms, les variables publiques et privées.
En JavaScript, le modèle de module est utilisé pour émuler davantage le concept de classes de manière à ce que nous puissions inclure à la fois des méthodes publiques / privées et des variables dans un seul objet, protégeant ainsi des parties particulières de la portée globale. Il en résulte une réduction de la probabilité que nos noms de fonctions entrent en conflit avec d'autres fonctions définies dans des scripts supplémentaires sur la page.
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();
Les avantages
pourquoi le modèle de module est-il un bon choix? Pour commencer, c'est beaucoup plus propre pour les développeurs venant d'un arrière-plan orienté objet que l'idée d'une véritable encapsulation, au moins du point de vue JavaScript.
Deuxièmement, il prend en charge les données privées - ainsi, dans le modèle de module, les parties publiques de notre code peuvent toucher les parties privées, mais le monde extérieur est incapable de toucher les parties privées de la classe.
Désavantages
Les inconvénients du modèle de module sont que, comme nous accédons aux membres publics et privés différemment, lorsque nous souhaitons modifier la visibilité, nous devons en fait apporter des modifications à chaque endroit où le membre a été utilisé.
Nous ne pouvons pas non plus accéder aux membres privés dans les méthodes qui sont ajoutées à l'objet ultérieurement . Cela dit, dans de nombreux cas, le modèle de module est encore très utile et lorsqu'il est utilisé correctement, il a certainement le potentiel d'améliorer la structure de notre application.
Le modèle de module révélateur
Maintenant que nous sommes un peu plus familiers avec le modèle de module, jetons un coup d'œil à une version légèrement améliorée - le modèle de module révélateur de Christian Heilmann.
Le motif du module révélateur est né car Heilmann était frustré par le fait qu'il devait répéter le nom de l'objet principal lorsque nous voulions appeler une méthode publique à partir d'une autre ou accéder à des variables publiques. pour objecter la notation littérale des choses qu'il souhaitait rendre publiques.
Le résultat de ses efforts a été un modèle mis à jour où nous définirions simplement toutes nos fonctions et variables dans la portée privée et retournerions un objet anonyme avec des pointeurs à la fonctionnalité privée que nous souhaitions révéler comme publique.
Vous trouverez ci-dessous un exemple d'utilisation du modèle de module révélateur.
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
Les avantages
Ce modèle permet à la syntaxe de nos scripts d'être plus cohérente. Il indique également plus clairement à la fin du module quelles sont nos fonctions et variables accessibles au public, ce qui facilite la lisibilité.
Désavantages
Un inconvénient de ce modèle est que si une fonction privée fait référence à une fonction publique, cette fonction publique ne peut pas être remplacée si un correctif est nécessaire. En effet, la fonction privée continuera de faire référence à l'implémentation privée et le modèle ne s'applique pas aux membres publics, uniquement aux fonctions.
Les membres d'objets publics qui font référence à des variables privées sont également soumis aux notes de règle sans correctif ci-dessus.