Non esiste una cosa privata in JS, ma è possibile giocare con gli ambiti utilizzando lo closures.
Diciamo ad esempio che nel tuo esempio non è necessario esporre var1
come proprietà pubblica. Si potrebbe facilmente riscrivere il codice come il seguente:
function ctest() {
var var1 = "haha";
this.func1 = function() {
alert(var1);
func2();
alert(var1);
}
var func2 = function() {
var1 = "huhu";
}
}
Poiché sia func1
e func2
condivide la stessa portata - sono definiti nella stessa funzione, ctest
- possono accedere alle stesse variabili. Naturalmente in tal caso non si dispone di var1
esposto, quindi: myobj.var1
sarà undefined
.
Se si desidera var1
per essere esposti come proprietà, allora quello che ti serve è bindfunc2
all'istanza oggetto creato nel costruttore:
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var func2 = function() {
this.var1 = "huhu";
}.bind(this);
}
Altrimenti func2
avrà un oggetto contesto diverso (this
). Se il browser non supporta bind
e non si desidera utilizzare uno spessore (come mostrato nel link qui sotto), è possibile usufruire delle chiusure ancora:
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var context = this;
var func2 = function() {
context.var1 = "huhu";
}
}
IMVHO è meno elegante.
Inoltre, non esiste una cosa come "privata" qui. – Alexander
Questo 'obj.func1()' dovrebbe essere presumibilmente 'myobj.func1()' – forsvarir
@forsvarir si dovrebbe - l'ho risolto per lui. – Alnitak