Alphasite

The programmers site

Estadísticas web

Estadisticas web

Publicidad

Languages

Google AdSense

Poll

Who's online

There are currently 0 users and 18 guests online.

Objetos en javascript


¿Pero Javascript tiene objetos?

No, o al menos no exactamente tal y como los entendemos en otros lenguajes de programación. Javascript esta basado en objetos y podría decirse que tiene una pseudo orientación a objetos. Esto significa que se pueden definir objetos con una serie de propiedades y metodos pero no incorpora ninguna de las restricciones tradicionales.

Por ejemplo, en javascript, un metodo de un objeto es sencillamente un puntero a una función y, puesto que no existe protección de ningún tipo (private, public) puede perfectamente sustituirse dicho puntero por un valor discreto (por ejemplo un 5).

¿Entonces por que usar objetos?

No hay espacio aqui para indicar por qué usar objetos ni los beneficios de una arquitectura orientada a objetos pero, a nivel global, el paradigma de objetos permite encapsular determinados parametros y agrupar distintas operaciones y propiedades comunes a todos los objetos.

La principal ventaja en cualquier caso es la reutilización y la instanciación. La creación de instancias de objetos nos permite tener distintos elementos que comparten una forma de funcionar es decir, unas caracteristicas comunes que hacen que la reutilización e incluso la refactorización de código sea mucho más sencilla.

Implementando objetos

En javascript, la palabra reservada new nos devuelve una instancia del objeto especificado. Por ejemplo:

  miInstancia = new MiObjeto();

El funcionamiento de javascript en cuanto a definición y asignación de variables es un tanto extraño y puede resultar bastante raro en las primeras aproximaciones pero se podría decir que javascript no tiene un tipado fuerte. A decir verdad no tiene ningún tipo de tipado y ni siquiera es necesario declarar las variables antes de utilizarlas. De esta forma podemos hacer:

  variable1.nombre = "hola";
  variable1.pais = "España";
  variable1.edad = 16;

  alert(variable1.pais);

Y funcionará perfectamente mostrando una alerta con el texto "España".

Cuando realizamos una llamada new JavaScript se encarga automáticamente de que la variable referenciada por la palabra reservada this apunte a la variable pasada, para justo a continucación llamar a la función especificada tras el new y finalmente volver a restaurar el valor de this.

El constructor de la clase y las propiedades

Así la forma más sencilla de definir las propiedades de un objeto es definirse un "constructor" que no es más que una función, con la siguiente forma.

function CMiObjeto(nombre, dir)
{
   this.nombre = nombre;
   this.direccion = dir;
   this.defaultVal = 5;
}

// Declarar una variable nueva
obj = new CMiObjeto('MiNombre','MiDir');
this.nombre = 'NuevoNombre';
alert(this.defaultVal); // Esto alerta un 5
 

Metodos para nuestra clase


Con la función anterior hemos dotado a nuestra clase de propiedades. En un primer vistazo podemos deducir que podemos añadir metodos a la clase haciendo:

function CMiObjeto_Metodo(param)
{
   // Una serie de acciones del metodo
}

function CMiObjeto(nombre,dir)
{
   // No se pone CMiObjeto_Metodo()
   this.Metodo = CMiObjeto_Metodo;
}
// Crear la instancia
obj = new CMiObjeto('name','dir');
// Llamar al metodo
miresultado = obj.Metodo('hola');

Si observamos el código observamos que se realiza una asignación de "this.Metodo" a la función definida (ojo, no se ponen parentesis al hacer la asignación ya que si se pusieran estaríamos asignando a this.Metodo el resultado de la llamada a la función y no un puntero a la función).

Refinando un poco

La solución anterior funciona y ciertamente podría valernos pero hay una forma mejor de hacer las cosas.

El problema de la solución anterior es que JavaScript, por la propia forma de trabajar que tiene, en cada nueva definición de objeto va a reservar espacio en memoria para cada una de las definiciones de metodo, es decir, si hacemos:

  obj1 = new CMiObjeto();
  obj2 = new CMiObjeto();

tendremos reservada en memoria dos "secciones" exactamente iguales correspondientes al código de los metodos de los objetos.

Para evitar esa doble reserva de memoria existe un objeto común a todos los objetos javascript que nos permite especificar un prototipo de función que será llamada para todas las instancias de la clase. El objeto se llama prototype. He aqui un ejemplo:

// Constructor del objeto
function CMiObjeto(nombre)
{
  this.nombre = nombre;
  this.propiedad1 = 'HolaMundo';
  this.propiedad2 = 'HolaMundo2';
  // NO definimos metodos aqui
}

CMiObjeto.prototype.Metodo1 = function CMiObjeto_Metodo1()
{
  // Aqui el código del metodo1
}

// El nombre no tiene por que coincidir
// con el nombre de la función
CMiObjeto.prototype.Metodo2 = function CComun()
{
  // Aqui el código del metodo2
}

// Se puede utilizar una función ya definida por ahí
CMiObjeto.prototype.Metodo3 = CFuncionDefinida;


Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Otras formas de asignar métodos (AjO)

En javascript, otra opción para asignar un método dentro de una clase sin necesidad de crear previamente el prototipo, es el siguiente:

function CMiObjeto(nombre,dir)
{
   
   this.Metodo = function (param)
   {
       // Una serie de acciones del metodo
       // en este caso no es necesario definir el método en otra función

   }

}
// Crear la instancia
obj = new CMiObjeto('name','dir');
// Llamar al metodo
miresultado = obj.Metodo('hola');