No existe nada privado en JS, pero puede jugar con ámbitos utilizando closures.
Digamos por ejemplo que en su ejemplo no necesita exponer var1
como propiedad pública. Desde aquí se puede reescribir su código mientras que sigue:
function ctest() {
var var1 = "haha";
this.func1 = function() {
alert(var1);
func2();
alert(var1);
}
var func2 = function() {
var1 = "huhu";
}
}
Debido a que tanto func1
y func2
comparte el mismo alcance - que se definen en la misma función, ctest
- que pueden tener acceso a las mismas variables. Por supuesto, en ese caso no tiene var1
expuesto, entonces: myobj.var1
será undefined
.
Si desea var1
a ser expuesto como una propiedad, entonces lo que necesita es bindfunc2
a la instancia del objeto que ha creado en el constructor:
function ctest() {
this.var1 = "haha";
this.func1 = function() {
alert(this.var1);
func2();
alert(this.var1);
}
var func2 = function() {
this.var1 = "huhu";
}.bind(this);
}
De lo contrario func2
tendrá un objeto de contexto diferente (this
). Si el navegador no soporta bind
y no desea utilizar una cuña (como se muestra en el siguiente enlace), se puede tomar ventaja de los cierres de nuevo:
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 es menos elegante.
Además, no hay tal cosa como 'privado' aquí. – Alexander
Este 'obj.func1()' probablemente debería ser 'myobj.func1()' – forsvarir
@forsvarir, sí, debería - Lo arreglé para él. – Alnitak