javascript-funciones-constructoras

Funciones constructoras en JavaScript

Una función constructora en JavaScript es una función especial que nos ayuda a crear y configurar objetos.

Estas funciones funcionan como “plantillas” que definen la estructura y comportamiento de los objetos que crearemos.

Veámoslo con un ejemplo básico:

function Persona(nombre, edad) {
    this.nombre = nombre; // Propiedad nombre
    this.edad = edad;     // Propiedad edad
}

Aquí, Persona es una función constructora que define un objeto con dos propiedades: nombre y edad.

Creación de un objeto con una función constructora

Para crear un objeto basado en una función constructora, usamos el operador new de la siguiente manera:

const persona1 = new Persona("Juan", 30);

console.log(persona1.nombre); // "Juan"
console.log(persona1.edad);   // 30

Cuando usamos el operador new:

  • Se crea un nuevo objeto vacío.
  • this dentro de la función constructora apunta a ese nuevo objeto.
  • El objeto se devuelve automáticamente al final de la función (a menos que devolvamos explícitamente algo diferente).

Este flujo permite que el objeto persona1 herede las propiedades definidas dentro de la función constructora.

Agregando métodos a los objetos

Además de propiedades, podemos agregar métodos (funciones asociadas al objeto) dentro de las funciones constructoras. Por ejemplo:

function Coche(marca, modelo) {
    this.marca = marca;
    this.modelo = modelo;

    this.detalles = function() {
        return `Coche: ${this.marca} ${this.modelo}`;
    };
}

const coche1 = new Coche("Toyota", "Corolla");
console.log(coche1.detalles()); // "Coche: Toyota Corolla"

En este caso,

  • La función detalles se define dentro de la función constructora
  • Estará disponible en todos los objetos creados con la función Coche.

El problema de los métodos en el constructor

Aunque podemos definir métodos dentro de una función constructora, existe un problema: cada objeto creado tendrá su propia copia del método. Esto es ineficiente si creamos muchos objetos.

Una mejor práctica es usar el prototipo para compartir métodos entre todos los objetos creados por la función constructora.

function Coche(marca, modelo) {
    this.marca = marca;
    this.modelo = modelo;
}

// Método compartido en el prototipo
Coche.prototype.detalles = function() {
    return `Coche: ${this.marca} ${this.modelo}`;
};

const coche1 = new Coche("Toyota", "Corolla");
const coche2 = new Coche("Honda", "Civic");

console.log(coche1.detalles()); // "Coche: Toyota Corolla"
console.log(coche2.detalles()); // "Coche: Honda Civic"

Aquí, el método detalles reside en el prototipo de Coche y no se duplica en cada objeto.

Clases como alternativa

Las clases son una forma moderna y más legible de crear objetos, reemplazando parcialmente las funciones constructoras en JavaScript.

class Coche {
    constructor(marca, modelo) {
        this.marca = marca;
        this.modelo = modelo;
    }

    detalles() {
        return `Coche: ${this.marca} ${this.modelo}`;
    }
}

const coche1 = new Coche("Toyota", "Corolla");
console.log(coche1.detalles()); // "Coche: Toyota Corolla"

Bajo el capó, las clases utilizan el mismo mecanismo de prototipos. Pero la sintaxis es más sencilla de usar.