Javascript OOP
Visita este artículo en http://www.estadobeta.com/2006/05/15/javascript-oop/
Por Ismael en Desarrollo, artículos, javascript, tipsIntroducció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”.
- Servicios:
- Comentarios RSS
- Menear!
- Del.icio.us

5/21/2006 at 2:17 pm
[…] 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) […]
5/22/2006 at 6:52 pm
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!
5/22/2006 at 7:02 pm
Claro, gracias! Está muy buena tu recopilación, todo un honor.
7/26/2006 at 5:52 pm
[…] 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. […]
8/4/2006 at 9:29 pm
[…] 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. […]
3/1/2008 at 10:28 am
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/10/2008 at 4:28 pm
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.