Atributos publicos privados y estaticos en una clase Javascript

De ChuWiki

Veamos un ejemplo sencillo de atributos estáticos, privados y públicos en una clase javascript.


Una clase[editar]

Para hacer una clase en javascript lo hacemos de esta manera

var Clase = function(parametros) {
   ...
}

es decir, simplemente declaramos una función que hará de constructor y dentro de esa función es donde definiríamos todos los atributos y métodos de la clase. Una vez definida, podemos instanciarla así

 var a = new Clase(parametros);

Puedes ver más sobre Clases y herencia con javascript

Atributo y métodos públicos[editar]

Los atributos y métodos públicos se definen poniendo this, por ejemplo

var Clase = function(parametros) {
   this.atributoPublico = 1;
   this.metodoPublico = function(parametro) {
      alert(parametro);
   }
}

y podríamos usarlo asi

 var a = new Clase(parametros);
 a.atributoPublico; // Da 1
 a.metodoPublico('hola');  // Saca un popup que dice hola.

Si una vez definida la clase queremos añadirle más métodos y atributos públicos, basta con añadírselos a su prototype paara que automáticamente lo tengan disponible todas las instancias existentes de esa clase o las que hagamos nuevas. Esto puede ser útil si la clase nos viene dada en una librería y nos gustaría añadirle algunos métodos públicos que nos sean de utilidad.

Si en el ejemplo anterior hacemos ahora

Clase.prototype.metodo = function(parametro) {
   alert(parametro);
}

podemos desde ya mismo llamar a metodo() en la variable a que teníamos de antes

a.metodo(11);  // saca un popup con un 11.


Diferencia entre públicos y privileged[editar]

A la hora de declarar métodos públicos de las dos formas que hemos comentado, hay una pequeña diferencia entre ellos. Los que se declaran dentro de la funcion constructor puede acceder a los atributos y métodos privados (que veremos más adelante), mientras que los segundos declarados con prototype, no puede hacerlo.

Por ello, los declarados así

var Clase = function(parametros) {
   this.metodoPrivilegiado = function(parametro) {
      alert(parametro);
   }
}

se les conoce también como "privileged", porque tienen acceso a los atributos y métodos privados que comentaremos aparte, mientras que los delcarados así

Clase.prototype.metodoPublicoVulgaris = function(parametro) {
   alert(parametro);
}

son símplemente conocidos como métodos pubilicos, sin acceso a métodos y atributos privados.

Atributos y métodos estáticos[editar]

Una vez definida la clase, los atributos y métodos estáticos se ponen directamente a la clase, fuera de la function() que hace de constructor

var Clase = function(parametros) {
   ...
};
Clase.atributoEstatico = 2;
Clase.metodoEstatico = function() {
   alert('hola, soy el metodo estatico');
}

y se usaría así

 Clase.atributoEstatico; // Da 2
 Clase.metodoEstatico();  // Sale lo de hola soy el metodo estatico en el popup.

No podemos acceder a ellos desde una instancia

 var a = new Clase(parametros);
 a.atributoEstatico;  // Da undefined
 a.metodoEstatico();   // Da error, el metodo no esta definido.

Atributos y métodos privados[editar]

Los metodos y atributos privados se hacen igual que los públicos, pero en vez de this, se poner como var

var Clase = function(parametro) {
   var atributoPrivado = parametro;
   var metodoPrivado = function(parametro) {
      alert(parametro);
   }
   this.llamaTodo = function() {
      metodoPrivado('hola');
      console.log(atributoPrivado);
   }
}

Hemos declarado un atributoPrivado con var y le damos el valor que nos pasen como parámetro en el constructor. Hemos puesto un metodoPrivado() también con var. Finalmente, un método público (privileged, según vimos antes) llamaTodo() para ver cómo acceder al método privado y público desde dentro de la clase.

Si ahora lo usamos así

 var a = new Clase(11);
 a.llamaTodo();

obtendremos un popup que dice "hola" y luego en consola (suponiendo que hayamos arrancado con un debugger que disponga de console.log()) el valor 11.