Clases y objetos

Desde la norma de ECMAScript5 Javascript puede considerarse un lenguaje de programación orientado a objetos, pero con algunas peculiaridades.

No posee todas las características de otros lenguajes orientados a objetos como Java o C++, pero si es capaz de manejar y crear objetos. Además permite la herencia, pero no la sobrecarga de funciones

Al hablar de heredar se habla de que los objetos descendientes pueden acceder a propiedades del objeto que los creó. No se trata de que reciba copias de su constructor sino referencias a sus propiedades y métodos. Esto lo implementa mediante prototype

Para quien conozca la programación orientada a objetos del estilo de java o C++: Javascript no tiene clases solo definiciones de objetos, constructors, que se usan como modelos para construir otros objetos.

Aunque en la última versión aparezca una estructura semántica con el nombre class. Estas clases son en realidad constructores tipo Function, pero aportan algunas facilidades como extends y métodos estáticos (static). Es una manera de parecerse a los hermanos mayores como Java, C++ y otros.

De hecho Javascript trabaja con un objeto global que gobierna a todos los demás objetos (es el señor de los objetos).

Y por supuesto todo el entorno web es visto por Javascript como objetos, con sus propiedades y métodos. Gracias a esto puede usarse para para interactuar con las páginas web. En algunos ejemplos verás que se utiliza alert( ) para mostrar ventanas con resultados de los scripts, en realidad alert es una abreviatura de window.alert( ), se trata del método alert( ) del objeto window. Incluso console es un objeto.

En resumen

En programación los elementos materiales se deben representar por datos. Un precio es un número, eso es fácil.

Una televisión es una marca, un precio, un tamaño, un modelo. Un objeto viene de perlas para representar este elemento compuesto.

Los objetos permiten implementar en código esos elementos materiales para que Javascript los puede manejar.

El caso de la television: puedes definir un tipo de objeto que la represente, sus propiedades serían marca, pulgadas, modelo, precio. Y un método podría ser imprimir para imprimir una etiqueta.

Esto sería la definición del objeto, su constructor (algo así como una clase).

Cada televisor concreto es un objeto material que responde al esquema de televisor, es una instancia del objeto televisor.

Los objetos en Javascript

La solución Javascript a los objetos no es nada compleja. Parte de un objeto global (Object) a partir del cual implementa una serie objetos predefinidos que a su vez son constructores, como Array, Function, String...

Estos objetos predefinidos heredan métodos y propiedades del objeto global e incorpora los suyos propios, que también pueden ser heredados por los objetos instanciados a partir de ellos, mediante la cadena de prototype.

Todo lo que se asigne a objeto.prototype es heredado por los objetos creados a partír de ése objeto. Lo que no se asigne son propiedaes y métodos estáticos, no heredables.

Este mecanismo permite los objetos crados por un programa puedan definir métodos y propiedades heredables asignándolos a prototype, además de métodos estáticos.

Al instanciar un objeto, creas una variable concreta con las propiedades y métodos del objeto desde el que se instancia. Esas propiedades pueden tener un valor por defecto, pero lógicametne pueden sobreescribirse. Ya no se trata de un objeto constructor sino de una instancia del objeto.

Recuerda: un objeto primero se define, se describe como es, y luego se instancia, se materializa en variables para utilizarlos. La definición es lo abstracto (constructor) y la el objeto es lo que se maneja (instancia), se usa.

Digamos que la clase, el constructor o el objeto es lo abstracto. Mientras que la instancia del objeto es un objeto concreto y manejable. El coche es un concepto abstracto, pero mi coche es un objeto material y concreto, es una instancia de la clase coche.

Y algo muy importante: una instancia de objeto no es como las demás variables, no es el lugar donde se almacena un valor, es una referencia, un puntero que señala al lugar donde se almacenan los datos.

Dentro de las definiciones de objetos disponemos de la variable this, esta variable se refiere al propio objeto, con ella los consturctories pueden inicializar el objeto o los métodos pueden trabjaas con las propiedades del objeto.

Un objeto se puede crear de varias maneras:

  • Directamente, con una expresión.
  • Con Object.create
  • A partir de una función.
  • A partir de una clase.

En cualquier caso recuerda que los objetos que creas viven dentro de un objeto global de Javascript, y heredan propiedades y métodos de este objeto global. Propiedades y métodos que puedes sobreescribir.

En resumen

Cada constructor de Javascript posee una propiedad denominada prototype: todo lo que se asigne a un objeto.prototype es heredado cuando se crea otro objeto a partir del él.

Las instancias de objetos no poseen la propiedad prototype, pero pueden acceder a los métodos y propiedades que sus constructores le propagan mediante ella.

El objeto this es una referencia al propio objeto que puede utilizarse dentro de sus métodos para referirse a él mismo.

Los métodos se nombran mediante el nombre del objeto propietario seguipo por el nombre del método separados por un punto.

Las popiedades y métodos se nombran mediante el nombre del objeto propietario seguido por el nombre de la propiedad o método separados por un punto.

objeto.metodo(args)

objeto.propiedad

También pueden usarse los nombres de métodos y propiedades (entrecomillados) como si fueran indices del objeto, encerrados entre corchetes:

obj["propiedad"] es lo mismo que obj.propiedad