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).
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.
En javascript, la palabra reservada new nos devuelve una instancia del objeto especificado. Por ejemplo:
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:
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.
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.
// Declarar una variable nueva
obj = new CMiObjeto('MiNombre','MiDir');
this.nombre = 'NuevoNombre';
alert(this.defaultVal); // Esto alerta un 5
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).
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:
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:
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;
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:
{
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');