JavaScript es un lenguaje es basado en prototípos. Un prototípo 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 JS 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 ]
}

CREACIÓ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:

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:

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:

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:

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:

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.

    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