Snap »

Javascript OOP

Visita este artí­culo en http://www.estadobeta.com/2006/05/15/javascript-oop/

Por Ismael en Desarrollo, artículos, javascript, tips

Introducción a Javascript Orientado a Objetos (OOP)

Desde su invención por Netscape a mediados de los 90’s, Javascript ha sido usado y abusado en Internet para agregar funcionalidad a los proyectos web. Ingenieros y diseñadores lo han utilizado de las más diversas maneras para resolver los mismos problemas, una y otra vez.

Comunmente referido como un lenguaje “de scripting” limitado a validar formularios y crear pop-ups, muchos ignoran que Javascript - una implementación del estándar EcmaScript - es en realidad un poderoso y flexible lenguaje orientado a objetos.

A diferencia de otros lenguajes Orientados a Objetos que se basan en Clases, Javascript se basa el Prototipos. En javascript, cualquier tipo de datos (texto, números, colecciones, funciones, etc.) son objetos constituídos por una colección de atributos. Todos son extensiones del objeto base, Object. Cada objeto tiene un prototipo que puede ser extendido con nuevos atributos.

Clases vs. Prototipos

Para definir el equivalente a una Clase en javascript, puedes definir una función y luego agregar métodos -funciones internas- a su prototipo:


/*
Definición de la función constructora
-----------------------------------------------------*/
var Persona = function(nombre, apellido, edad){
    this.nombre = nombre;
    this.apelido = apellido;
    this.edad = edad;
}
/*
Extensión del prototipo
-----------------------------------------------------*/
Persona.prototype.nombreCompleto = function(){
    return this.nombre + " " + this.apellido;
}
/*
Creación de 2 instancias de Persona
-----------------------------------------------------*/
var persona1 = new Persona("Antonia", "Gómez", 28);
var persona2 = new Persona("José", "Miranda", 35);
 
 
document.write(persona1.nombreCompleto());// retorna "Antonia Gómez"
 
document.write(persona2.nombreCompleto());// retorna "José Miranda"

A diferencia de crear objetos directamente, la creación de un prototipo nos permite diseñar una “plantilla” para estructurar el comportamiento de multiples instancias - una clase -. Al prototipo de Persona podemos agregar nuevas operaciones que estarán disponibles en todas las instancias de la Clase.


Persona.prototype.anioNacimiento = function(){
    var ahora = new Date();
    return ahora.getFullYear() - this.edad;
}
 
...
 
document.write( persona1.anioNacimiento() ); // retorna 1978 (2006 - 28)

Las variables y atributos de una instancia pueden ser cualquier tipo de datos existentes en Javascript, incluso referencias a otros objetos:


Persona.prototype.amigos = []; // un array (colección) de otros objetos Persona.
/*
Método para agregar "amigos" a las instancias de Persona
-----------------------------------------------------------*/
Persona.prototype.esAmigoDe(persona_amigo){
    this.amigos.push(persona_amigo);
}
 
...
 
persona1.esAmigoDe(persona2);
persona1.esAmigoDe( new Persona("Ismael", "Celis", 28) );
 
document.write( persona1.nombreCompleto() + " tiene " + persona1.amigos.length + " amigos."); // retorna "Antonia Gómez tiene 2 amigos"
 
document.write( persona1.amigos[1].nombre ); // retorna "Ismael"

Los prototipos Javascript son en si mismos objetos que también pueden ser escritos usando notación jSon:


var Persona = function(nombre, apellido, edad){
    this.nombre = nombre;
    this.apelido = apellido;
    this.edad = edad;
}
 
/*
Se definen todos los atributos y métodos del prototipo como un solo objeto, en notación jSon.
——————————————-*/
Persona.prototype = {
    amigos: [],
    anioNacimiento: function(){
        var ahora = new Date();
        return ahora.getFullYear() - this.edad;
    },
    esAmigoDe: function(persona_amigo){
        this.amigos.push(persona_amigo);
    }
}

Además, donde todo en Javascript son objetos basados en prototipos, podemos incluso extender objetos “nativos” de javascript, como el objeto Array.

Array.prototype.existe = function (value) {
    for (var i=0, len=this.length; i < len; i++) {
      if (this[i] === value) {
        return true;
      }
    }
    return false;
};
// Creamos un array como ejemplo
var nombres = ["perro", "gato", "avestruz", "elefante"];
document.write( nombres.existe("gato") ); // TRUE.
document.write( nombres.existe("ballena") ); // FALSE.

Diseñar aplicaciones en base a Objetos tiene ventajas conocidas: es mucho más fácil compartimentalizar el programa en módulos autónomos que toman responsabilidades específicas, y por lo tanto el resultado es más mantenible y extensible. Además, se separa la lógica “pesada” del código cliente. Este último puede utilizar la interfaz más sencilla de las clases sin preocuparse de los detalles de la implementación.

Javascript suele ser mirado como un auxiliar limitado en el desarollo web, pero son frecuentes las aplicaciones complejas donde el clásico código procedural se convierte en un lastre. Esto es más cierto aún ahora con el boom de Ajax y y las RIA’s.

La biblioteca Prototype provee una excelente base para escribir aplicaciones Javascript, “OOP style”.

javascript,OOP,prototype,programación

7 comentarios para “Javascript OOP”

  1. Gravatardiegolo 3.0 » Blog Archive » links for 2006-05-21 Dice:

    […] Introducción a Javascript OOP Desde su invención por Netscape a mediados de los 90’s, Javascript ha sido usado y abusado en Internet para agregar funcionalidad a los proyectos web. Ingenieros y diseñadores lo han utilizado de las más diversas maneras para resolver sus problemas. (tags: JavaScript Tutoriales Programación DesarrolloWeb) […]

  2. Gravatarkitune Dice:

    Perdona el offtopic:)

    Felicidades por el blog, me ha gustado y lo he añadido a la lista de blogs recomentados de ikkaro. www.shinkitune.com/ikkaro

    He visto varios artículos que has escrito que me han gustado también, intentare ir añadiendo algunos también a la página si me lo permites.

    un saludo!

  3. GravatarIsmael Dice:

    Claro, gracias! Está muy buena tu recopilación, todo un honor.

  4. GravatarEstadoBeta » Archivo » Javascript: clases con argumentos opcionales Dice:

    […] Por supuesto estos ejemplos aún no sirven de nada. Para saber cómo agregar y utilizar métodos y atributos a tus clases, lee este otro artículo. […]

  5. GravatarEstadoBeta » Archivo » Prototype Dice:

    […] Lo que sigue es una descripción de los principales aportes de Prototype. Para entenderla debes estar familiarizado con Javascript y los conceptos de función / método, variable y nociones básicas de Orientación a Objetos. También recomiendo que leas este y este artículo de EstadoBeta, si no lo has hecho ya. […]

  6. GravatarYoel Villarreal Dice:

    Amigo Ismael:

    Gracias por esta entrega, me ha servido para iniciarme en este mundo del Javascript porque enrealidad no le habia hecho mucho caso pues solo me habia dedicado anteriormente a codificar del lado del servidor, ahora si me permite quisiera hacer una observacion en su codigo del cual copie para probar y me devolvia un valor undefined y es que en el apartado Clases vs Prototipos en la definicion de la funcion constructora podria corregir donde dice this.apelido pues que seria this.apellido

    Solo busco claridad y pues como tome la pagina como referencia queria ayudarle.

    Gracias de antemano.

  7. Gravatarzancom Dice:

    Buenas tardes, estoy estudiando a fondo el javascript y encontre una libreria que puedo usar en un proyecto, pero estoy confundido, aqui les envio una parte a ver si me pueden ayudar.

    var dibujar=new Object();

    dibujar.evento=function(){this.tipo=null,this.valor=null};
    dibujar.evento.prototype.initEvent=function(sType,_591e){instrucciones}

    primera pregunta: como deduzco yo que dibujar.evento es una subclase de dibujar y no un metodo, sera porque luego tiene opciones de prototype.

    dibujar.mover=function(){instrucciones}
    dibujar.mover.prototype= new dibujar.event;

    segunda pregunta: podria decir tambien dibujar.mover.prototype=new dibujar.event(); cual es la diferencia?

    var mover = new dibujar.mover();

    tercera pregunta: podria explicarme el significado de esta instruccion y la diferencia con la instruccion anterior

    gracias de antemano.

Deja un comentario

XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>