L'ultimo aspetto da considerare è la definizione dei membri privati. Essi non sono accessibili dall'esterno proprio perchè non sono contenuti nel mega oggetto ritornato dalla funzione principale (che, ricordiamo, viene subito invocata).
Questi membri infatti hanno uno scope limitato ed esistono solo all'interno della funzione che definisce l'oggetto. Essi non possono essere disponibili proprio perché non c'è modo di riferirsi a questa funzione in quanto non viene salvata in nessuna variabile ma viene eseguita subito. Questi membri privati però sono accessibili all'interno di metodi e proprietà pubbliche in quanto condividono lo scope tra di loro. Ecco un esempio:
var NameModule = function() {
// variabile privata
var name = "Alberto";
// metodo privato
var getName = function() { return name; }
// il modulo ritorna l'oggetto pubblico
return {
alertName: function() { alert(getName()); }
}
}();
var nm = NameModule;
nm.alertName();
In questo breve esempio abbiamo creato una proprietà privata (name), un metodo privato (getName) che legge la proprietà privata e un metodo pubblico (alertName) che invoca la funzione JavaScript alert passandogli come parametro il risultato della funzione privata getName.
Bisogna evidenziare il fatto che non abbiamo utilizzato la parola chiave 'this', per evitare problemi di scope. Infatti essa fa riferimento ad un contesto che è esterno al nostro oggetto, nel momento in cui invochiamo il metodo alertName().
Anche quando invochiamo il metodo privato getName() all'interno del metodo pubblico, evitiamo di utilizzare il costrutto this: il metodo getName non esiste all'interno dell'oggetto ritornato (che presenta un unico membro che è alertName), ma è accessibile direttamente in quanto facente parte dello scope di invocazione.
È importante specificare che sia la proprietà name, sia la funzione getName devono essere precedute dalla parola chiave var, nella dichiarazione, altrimenti vengono considerate variabili globali (proprietà dell'oggetto window).
In questo modo otteniamo ciò che desideriamo: la proprietà name e il metodo getName sono accessibili solamente dai membri pubblici della classe e non dall'esterno.
Ci sarebbe da aggiungere che questi elementi, name e getName, sono sì privati rispetto allo scope esterno, ma rispetto agli scope annidati diventano privilegiati e per convenzione andrebbero scritte con un underscore (_) anteposto all'identificatore.
PhantomJS, headless browser per test con JavascriptIl tool ideale per realizzare, da terminale, operazioni in remoto su... |
Creare e leggere QR Code in JavaScriptApplicazioni 'QR Code enabled' per il Web e per il mobile,... |
Jquery UI Map: web-mapping con Google Maps e jQueryUn plugin di jQuery UI per intefacciare applicaizoni Web/mobile con... |
Scrollorama e Scrolldeck, slideshow d'effetto con jQueryPlugin jQuery per ottenere Slideshow con diversi effetti di scrolling |
jCanvas, un primo semplice graficoAlla scoperta della libreria jCanvas, per semplificare il disegno e... |
Guida Node.jsIl framework che permette di per usare V8, l'interprete JavaScript... |
Canvas, guida ai frameworkCanvas, tra gli elementi di HTML5 è forse quello di maggior impatto.... |
Guida Javascript: tecniche avanzateUna guida dal taglio pratico per approfondire la programmazione a... |
Ogni martedì, direttamente nella tua e-mail: guide, articoli, script, novità e approfondimenti tecnici su JavaScript.
Iscriviti alla newsletter
|
|
Corso Webmaster base18 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso JQuery e Ajax per Webmaster03 Luglio 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |
|
|
Corso Webmaster base11 Giugno 2012 a Roma |