Il n'y a rien de privé dans JS, mais vous pouvez jouer avec des étendues en utilisant le closures. Par exemple, disons que dans votre exemple, vous n'avez pas besoin d'exposer var1
comme propriété publique. Vous pouvez facilement réécrire votre code comme suit:
function ctest() {
var var1 = "haha";
this.func1 = function() {
alert(var1);
func2();
alert(var1);
}
var func2 = function() {
var1 = "huhu";
}
}
Parce que les deux func1
et func2
partage la même portée - ils sont définis dans la même fonction, ctest
- ils peuvent accéder aux mêmes variables. Bien sûr, dans ce cas vous n'avez pas var1
exposé, donc: myobj.var1
sera undefined
.
Si vous voulez var1
d'être exposé comme propriété, ce dont vous avez besoin est bindfunc2
à l'instance d'objet créé dans le constructeur:
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var func2 = function() {
this.var1 = "huhu";
}.bind(this);
}
Sinon func2
aura un objet contexte différent (this
). Si le navigateur ne supporte pas bind
et vous ne voulez pas utiliser une cale (comme indiqué dans le lien ci-dessus), vous pouvez profiter des fermetures à nouveau:
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 est moins élégante.
Aussi, il n'y a pas une telle chose comme «privé» ici. – Alexander
Ce 'obj.func1()' devrait probablement être 'myobj.func1()' – forsvarir
@forsvarir ouais il devrait - je l'ai corrigé pour lui. – Alnitak