JavaScript Orientado a objetos
JavaScript es un lenguaje que está basado en prototipos. Un prototipo es un objeto abstracto, capaz de contener otros objetos dentro, los cuales pueden ser distintos tipos de datos: variables (números, cadenas de texto, valores lógicos), vectores, funciones e inclusive otros grupos de objetos.
Entonces, en vez de programar una clase, para estar orientados a objetos en JavaScript definimos un prototipo. Las variables dentro de este serán las propiedades, y las funciones serán los métodos:
[Objeto = Prototípo]{
[ Propiedad = Variable ]
[ Método = Funcion ]
}
Creacción de clases
La forma en que los lenguajes orientados a objetos comúnmente resuelven el problema anterior es mediante el uso de Clases, en JavaScript no es posible declarar Clases, pero si es posible instanciar objetos a partir de un constructor.
El objeto Function es utilizado como objeto instanciable en JavaScript , y el cuerpo de la función es el constructor del nuestros objetos. Una vez que tenemos un constructor, podemos llamarlo con el operador new.
/*clase de ejemplo*/
miClase = new Function();
/*instancia de la clase*/
nuevoObjeto = new miClase();
El método mas difundido para emular las clases en JavaScript es aprovechar el funcionamiento de la palabra clave this dentro de los constructores. Cuándo una función es llamada con el operador new, this hace referencia al objeto que será retornado.
Propiedades de una clase
Una vez sabemos crear una clase, vamos a definir propiedades para esa clase:
1 2 3 4 5 6 | var Animal = function (nombre, color, edad) { this.nombre = new String(nombre); this.color = new String(color); this.edad = new Number(edad); } |
Ahora creamos una instancia de la clase, una vez que la tenemos podemos acceder a sus propiedades:
1 2 3 4 | var perro = new Animal(”Brutus”,”Negro”,3); alert(perro.nombre); //Saca un alert con “Brutus” alert(perro.color); //Saca un alert con “Negro” alert(perro.edad); //Saca un alert con “3″ |
Métodos de una clase
También podemos definer métodos para la clase anteriormente definida:
1 2 3 4 5 6 | var Animal = function (nombre, color, edad) { this.nombre = new String(nombre); this.color = new String(color); this.edad = new Number(edad); this.informacion = function () {alert(”Nombre: “+this.nombre+” Color: “+this.color+” Edad: “+this.edad);} } |
Ahora creamos una instancia de la clase, una vez que la tenemos podemos acceder a sus métodos:
1 2 | var perro = new Animal(”Brutus”,”Negro”,3); perro.informacion(); //Saca un alert con “Nombre: Brutus Color: Negro Edad: 3″ |
Métodos y propiedades privadas
Por ahora los métodos y propiedades definidos eran totalmente públicos, esto puede que no sea siempre lo ideal, a continuación vamos a ver como privatizarlos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var Animal = function (nombre, color, edad) { //Propiedades publicas this.nombre = new String(nombre); this.color = new String(color); this.edad = new Number(edad); //métodos publicos this.informacion = function () {alert(”Nombre: “+this.nombre+” Color: “+this.color+” Edad: “+this.edad);}; this.setPeso = function (p) {peso=p;}; this.getPeso = function() {infoPesoPrivado(peso)}; //propiedades privadas var peso = 20; //metodos privados function infoPesoPrivado(peso){alert(”El animal pesa: “+peso)} } var perro = new Animal(”Brutus”,”Negro”,3); alert(perro.peso); //Saca un alert con “Undefined” ya que la propiedad es privada perro.getPeso(); //Saca un alert con “El animal pesa: 20″ perro.setPeso(50); //Se establece la propiedad privada ‘peso’ a 50 perro.getPeso();//Saca un alert con “El animal pesa: 20″ |
Herencia
Uno de las características más interesante de la programación Orientada a Objetos, es la herencia de métodos / propiedades. En JavaScript se puede lograr mediante los prototipos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var Animal = function () { this.ojos = 2; this.patas = 4; } var Perro = function () { this.color = “blanco”; this.color_ojos = “Negro”; } Perro.prototype = new Animal(); var mascota = new Perro(); alert(mascota.ojos); //Retorna 2 alert(mascota.color); //retorna blanco |