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.