Zootropo

Diario del mundo geek.

martes, julio 27, 2004

Javascript: Encapsulación

La encapsulación se refiere a impedir el acceso a determinados métodos y propiedades de los objetos estableciendo así que métodos y propiedades de estos pueden ser utilizados desde el resto del código. Esto se consigue en otros lenguajes de programación utilizando modificadores de acceso, que definen si cualquiera puede acceder a esa función o variable (public) o si está restringido el acceso a la propia clase (private). Para acceder al valor de las variables private o modificar su valor se añaden también funciones cuyo único cometido es este, y a las que normalmente se les da el nombre de getVariable y setVariable.

En Javascript se carece de estos modificadores de acceso, de forma que nos valemos del ámbito de la variable (en que parte del programa puede ser accedida) para emularlo. Para establecer una variable como 'privada' usamos var para que sea local a la función constructora en lugar de hacer 'this.variable = ...'. Además tenemos que incluir las funciones get y set dentro de la misma función constructora ya que la variable es ahora local y si estas estuvieran fuera de la función constructora no podrían acceder a ella.

<script>
function objeto(){
var numero = 22;
var texto = "Hola";
this.setNumero = setNumero;
this.setTexto = setTexto;
this.getNumero = getNumero;
this.getTexto = getTexto;

function getNumero(){
return numero;
}

function getTexto(){
return texto;
}

function setNumero(nnumero){
numero = nnumero;
}

function setTexto(ntexto){
texto = ntexto;
}
}

var miObjeto = new objeto();

/*numero es local a objeto, por lo tanto esto daria error quejandose de que numero no esta definido*/
//document.write(numero);
/*como no hemos asociado numero al objeto con this.numero esto tampoco funciona y nos imprime undefined*/
document.write(miObjeto.numero + "<br/>");
//Esta es la forma correcta de acceder
document.write(miObjeto.getTexto() + "<br/>");
//y esta la de modificar su valor
miObjeto.setTexto("Adios");
document.write(miObjeto.getTexto());
</script>