JS: Introducción a la POO
Teoría: Constructor
Las aplicaciones en JavaScript crean y eliminan muchos objetos durante su ejecución. A veces, estos objetos son completamente diferentes, y otras veces se refieren al mismo concepto pero con diferentes datos. Cuando se trata de conceptos del dominio (o entidades), es importante tener una abstracción que oculte la estructura de estos objetos.
Tomemos el concepto de "empresa" y construyamos una abstracción alrededor de él sin usar encapsulación:
Ahora, su uso:
Esta abstracción facilita el trabajo con empresas (especialmente cuando se realizan cambios en la estructura), oculta los detalles de implementación y hace que el código sea más "humano". Intentemos hacer lo mismo utilizando encapsulación:
Y su uso:
Aquí vemos algunas ventajas en comparación con la versión basada en funciones:
- Ya no es necesario importar
getName, ya que está incluido en la empresa. - Se puede utilizar el autocompletado de código.
Pero junto con las ventajas, también hay desventajas. Miremos nuevamente detenidamente el código del constructor. Cada vez que se llama, devuelve un nuevo objeto, lo cual es un comportamiento esperado. Sin embargo, lo que definitivamente no queremos es crear métodos cada vez que se llama al constructor (y se crearán cada vez que se crea un objeto). A diferencia de los datos normales, los métodos no cambian. No tiene sentido crearlos nuevamente en cada llamada, lo que consume memoria y tiempo de procesador.
Reescribamos nuestro ejemplo evitando la creación constante de métodos:
El operador new
Todos los métodos de creación de objetos descritos anteriormente tienen derecho a existir y se utilizan en la vida real. Sin embargo, JavaScript tiene soporte incorporado para generar objetos. Reescribamos nuestro ejemplo utilizando una función constructora.
Ahora, su uso:
Lo más interesante de este ejemplo es el operador new (que, como muchas cosas en JavaScript, no funciona como new en otros lenguajes). Básicamente, crea un objeto, lo establece como contexto durante la llamada al constructor (en este caso, Company) y devuelve el objeto creado. Por eso el constructor en sí no devuelve nada (aunque puede hacerlo, pero eso es otra historia), y el objeto deseado se encuentra dentro de la constante company.
Visualmente, este enfoque no parece mejor que la creación manual anterior, pero involucra otro mecanismo importante en JavaScript: los prototipos (más sobre ellos en la próxima lección).
Todos los tipos de datos en JavaScript que pueden ser representados como objetos (o que son objetos en sí mismos, como las funciones) tienen constructores incorporados. A veces, estos constructores reemplazan la sintaxis especial para crear datos (como en el caso de las matrices), y otras veces son la única forma de crear datos de ese tipo (como en el caso de las fechas):
Pero no todas las funciones pueden ser constructores. La falta de su propio contexto hace imposible usar el operador new con funciones de flecha: