Come scritto su Javascript: the good parts, un modulo è una funzione o un oggetto che presenta una interfaccia ma nasconde il suo stato e la sua implementazione.
Ho infatti utilizzato il pattern module quando ho avuto la necessità di incapsulamento, cioè di avere un metodo di una classe che avesse una interfaccia pubblica ma nascondesse i dettagli della sua implementazione.
Oltre all’incapsulamento mi serviva avere un costruttore con argomenti, ho quindi introdotto anche esso nel codice che segue e che implementa il module pattern con costruttore.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function Module(name) { this.name = name; } Module.prototype = (function() { var i = 0; function myPrivateFun() { console.log("private " + i++); } function myPublicFun() { myPrivateFun(); console.log(this.name); } return { publicFun: myPublicFun }; })(); var m = new Module("john"); m.publicFun(); // private 0 John |
Il costruttore è definito nel modo usuale disponibile in Javascript.
Il pattern module è utilizzato nell’implementazione del prototype, dove abbiamo
- privateFun che è una funzione privata, visibile solo da publicFun
- publicFun che è una funzione pubblica, visibile esternamente
- il return che restituisce un oggetto i cui membri sono visibili esternamente, e dove quindi inseriamo i metodi pubblici
Abbiamo utilizzato nel codice:
- invocazione immediata delle funzioni
- closures
Invocazione immediata delle funzioni
Detta in inglese IIFE (immediately invoked function expressions), l’invocazione immediata delle funzioni, del tipo
1 2 |
(function() { })(); |
fa si che la funzione venga eseguita immediatamente, e che ne venga restituito il risultato mediante il return di cui sopra
Le closure
Le closure, chiusure in italiano, fanno sì che che le funzioni definite in un certo scope continuino ad avere accesso alle variabili accessibili da quello scope anche quando la funzione più esterna che definiva quello scope è terminata. Nell’esempio si vede come si acceda alla variabile i anche quando la funzione più esterna è terminata.