Contenido

Programación Orientada a Objetos en Javascript

25 sep

+ 21

Últimamente estamos viendo que están apareciendo muchas librerías en Javascript (mooTools, jQuery, Prototype,..) todas ellas se componen de una o varias clases en Javascript conteniendo cientos de líneas de código englobadas en métodos.

Javascript por definición no es un lenguaje orientado a objetos y debido a la potencia de esta programación han tenido que idearselas para conseguir un funcionamiento similar, intuitivo y potente.

Me ha parecido muy curioso que mediante el uso de la versión implicita de un array hayan creado una estructura de “objeto” muy clara, similar a las usadas en lenguajes si orientados a objetos. Vamos a ver como crear una clase y por que llegamos a esa estructura.

Introducción

Javascript es un lenguaje curioso y adictivo, cuando empiezas con él crees que únicamente sirve para hacer 4 efectos y 3 comprobaciones, pero va pasando el tiempo te das cuenta que es mucho más que eso. Es un lenguaje completo y potente.

Tiene sus limitaciones como cualquier lenguaje, y el hecho de ser un lenguaje de cliente no es que sea el más apropiado para según que funcionalidades, pero con un poco de idea e imaginación podemos hacer cualquier cosa bien hecha.

Antecedentes 

Una propiedad muy curiosa de Javascript es la propiedad de igualar variables a funciones, eso nos permite crear una variable que cada vez que la llamemos nos ejecutará una funcionalidad especificada.

var alerta_nombre = function() { alert("NOMBRE"); };
alerta_nombre();

No se me ocurría otro ejemplo más claro, pero podemos ver que hemos convertido una variable en una función.

Otra curiosidad es el uso de los arrays de una forma bastante similar a los objetos.

var nombres = new Array();
	nombres["PEPE"]= "Mi nombre es PEPE";
	nombres["PACO"]= "Mi nombre es PACO";
	nombres["PEDRO"]= "Mi nombre es PEDRO";
	alert(nombres.PEPE);

Conclusión (I)

Entonces, ya visto esto podemos unificar las dos funcionalidades y conseguir algo más o menos elegante para conseguir nuestra clase.

var persona= new Array();
	persona["nombre"]= "Pepe";
	persona["presentar"]= function() {alert("Mi nombre es " + persona["nombre"])};
	persona.presentar();

Conclusion (II) 

¿Y si usamos la forma implicita?

var persona = {
        nombre: "Pepe",
        presentar: function() {
	alert("Mi nombre es " + this.nombre)
	}
};
persona.presentar();

Se parece algo más a una clase ¿no?

Lo que más me llama la atención es que un lenguaje que no está pensado para ser orientado a objetos, se adapte mediente funcionalidades ya implementadas del leguaje a este paradigma de programación. ¿Casualidad?

  • ¿No es orientado a objetos? Estoy estudiando JavaScript con un libro y en todo momento se hacen referencias a los objetos del navegador (window, document, history, etc) y a los de javascript propios (date, math..) y a sus métodos como document.write.

  • Buenas Althor, yo la definición que conozco de programación orientada a objetos es que se llama Lenguaje Orientado a Objetos aquellos lenguajes que permite crear objetos y usarlos.

    Y javascript simplemente usa objetos ya definidos por el lenguaje.

    Quizas algun gurú de este lenguaje nos pueda aclarar más esto.

    Actualizo
    Parece ser que no se ponen de acuerdo en que características ha de tener un lenguaje para ser realmente orientado a objetos, en la wikipedia he encontrado esto y parece que no lo tienen dentro de los Orientados a Objetos, aunque en la misma descripción lo asemejan al Java (aunque solo en estructura).

  • Pero en JavaScript sí se pueden crear nuevas clases de objetos. Utlizando uno de estos dos sitemas http://w3schools.com/js/js_objects.asp

  • Hombre, no soy ningún experto en Javascript, pero esto me parece que es crear instancias de un objeto, en este caso Object().

    De todas formas me parece muy interesante esto, seguiré indagando :D

    Gracias ;)

  • Vaya, muy interesante, que ironico que resulte tan fácil crear un objeto, quiza habra algo mas cuando llegue css 3.0

  • Imzyos!, supongo que te refieres a Javascript 2.0 ¿no?

    CSS es otra cosa, y no tiene nada que ver esto :P

  • Eso digo yo, qué tiene que ver css con javascript y OO :/
    Resulta tan fácil como en los lenguajes sí orientados a objetos xD

  • En JS todo es objetos, basicamente, hasta las function son objetos, el tema es que declarar una Clase e instanciarla parece que tiene que ser algo imlpicito en un lenguage OO, es por eso, que estimo que no lo consideran un lenguage a objetos… pero en mis experimentos, he podido hacer agregacion con clases… y entonces lo consifero como un lenguage orientado a objetos..

    Saludos

  • En mi opinión que se puedan crear objetos no es suficiente para hablar de Lenguaje Orientado a Objetos. Para mí en un lenguaje OO es necesario que se puedan crear clases. Es que si no lo único que tendría de particular el lenguaje es poder hacer new() y referirse a los métodos y propiedades con el punto (objecto.prop=”kaka”), no creo que sea suficiente como para darle un adjetivo al lenguaje.

    Y, sigue siendo mi opinión, con el truco del Array estás creando un objeto, no una clase, así que si sólo fuese por eso no creo que JS mereciese llamarse OO. Pero según el enlace que da Althor se pueden crear “Templates”, que yo diría que son casi clases (o sin el casi), aunque no tengamos herencia, polimorfismo, etc. No sé, a mí me da nosequé llamarle OO a JS, pero por ahí anda…

  • No se, a mí me parece un lenguaje estructurado. Si nos fijamos en la conclusión 2 que es la forma implícita, se parece mucho a las estrucutras de C, no C que este si es OO. Aunque podemos crear templates como han dicho mas arriba y con lo que se comenta en estas conclusiones se podría parecer a los lenguajes OO, aún faltaría algo tan esencial como la herencia y el polimorfismo, como alguien ha dicho anteriormente.
    Esto es mí opinión, no soy ningún gurú precisamente :P.

  • No se ustedes,pero creo que estan cayendo en algo parecido a lo que se decia de VB6 en un principio…

    recuerden que la pomada de M$ era que vb6 era netamente orientado a objetos, bueno, si se podian crear e instanciar clases y generar metodos, tb te valias de los objetos de formulario ya creados y sus respectivos metodos y propiedades…

    pero que paso?… termino decidiendose o catalagandose de ser un lenguaje orientado a eventos dada la forma de desencadenar las cosas….

    no sera esta la forma de javascript?

    ————————

    humm.. tengo demaiadas dudas….

  • la verdad es que para que un lenguaje sea orientado a objetos este debe soportar ciertas caracteristicas:
    * Abstracción: los objetos se comunican entre si y no saben como estan implementados entre ellos, solo se usan.
    * Encapsulamiento: también llamado “ocultación de la información”. Cada objeto está aislado del exterior.
    * Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. .
    * Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación.

    (grax wikipedia)

    yo creo que javascript no tiene herencia….. (recuerden que noes lo mismo a que js sea un lenguaje basado en objetos).

  • Excelente el articulo. javaScript , no es completamente orientado a objetos. Porque para la herencia se necesita usar el metodo prototype. Me gusto mucho la logica que usaste para llegar al final.

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.