jueves, 4 de junio de 2009

Lenguaje dinámico

Bien, javascript es un lenguaje dinámico por que poseé objetos dinámicos. Y... qué es un objeto dinámico?.
Un objeto dinámico es un objeto que puede cambiar la definición de sus miembros en tiempo de ejecución.
cual es la diferencia con un objeto común?
En un lenguaje orientado a objeto y con clases, los objetos son tipicamente estaticos, con lo cual no podemos por ejemplo cambiar la definición de un método en tiempo de ejecución. En cambio en un objeto dinámico si podemos hacer esto.
Es importante comprender que esta caracteristica de javascript afecta profundamente a nuestra forma de programar, ya que nunca podremos estar seguros, a priorí, sobre la definición de los miembros de un objeto que recibamos como parámetro por ejemplo.
Veamos un poco de como utilizar esto en el código.
Supongamos que creamos un objeto iluminador, que posea un método prender y un miembro obj, al ejecutar el método prender, el objeto iluminador se encarga de setear el color de fondo de su objeto obj, a blanco.
(recuerda que puedes ejecutar este código pegandolo en el cuadro de texto en la parte superior derecha de este blog)

/// objetos dinamicos
//definimos el objeto iluminador
var iluminador = function (){
this.obj=null;
}
//definimos el método prender, dentro del prototipo de iluminador
iluminador.prototype.prender = function(){
this.obj.style.backgroundColor = 'white';
}

//Creamos una instancia de iluminador, en la variable i
var i = new iluminador();

//obtenemos una referencia a algun objeto de la página
//en este caso el cuadro de cabecera
var head = document.getElementById('header-wrapper');

//este es nuestro primer caso de objeto dinamico
// hasta ahora no habiamos definido el miembro obj para nuestra instancia i
// ahora colocamos la referencia head en el miembro obj.
i.obj =head;
//podemos ver la definicion de prender
alert(i.prender);
//iluminamos el objeto obj en este caso head
i.prender();


//OBJETO DINÁMICO
//en javascript podemos redefinir un miembro, en este caso un método, en tiempo de
//ejecuccion y de esta forma modificar el comportamiento.
i.prender=function(){
this.obj.style.border = '5px solid green';
}

//ahora el método prender, en lugar de iluminar el objeto obj,
//se encarga de establecer el borde del objeto a 5 pixeles en color verde.
i.prender();

//es importante comprender que el objeto que cambio es el objeto i,
//y no el objeto iluminador, ya que si creamos una nueva instancia del
//objeto iluminador, dentro de la variable i2
var i2 = new iluminador();
i2.obj =head;
//podemos ver que la definicion del miembro prender, continua siendo la del
//objeto iluminador. la razón de esto será mucho más clara cuando
//veamos herencia prototipal
alert(i2.prender);
i2.prender();

No hay comentarios:

Publicar un comentario en la entrada