Command Palette

Search for a command to run...

Constructores en Clases ES6

Aprende a usar el método constructor de clases ES6 para inicializar propiedades, validar datos y configurar instancias correctamente.

Lectura: 14 min
Nivel: Principiante

TL;DR - Resumen rápido

  • El constructor es un método especial que se ejecuta al crear una instancia
  • Se usa para inicializar propiedades y configurar el estado inicial
  • Puede recibir parámetros con valores por defecto
  • Es el lugar ideal para validar datos antes de crear el objeto
  • Si no defines un constructor, JavaScript usa uno vacío automáticamente
  • Puedes pasar objetos de configuración para mayor flexibilidad

El Método Constructor

El constructor es un método especial en las clases de JavaScript que se ejecuta automáticamente cuando creas una nueva instancia con el operador new. Su propósito principal es inicializar las propiedades del objeto y establecer su estado inicial.

A diferencia de otros métodos de la clase, solo puede haber un constructor por clase. Si intentas definir múltiples constructores, JavaScript lanzará un error de sintaxis. El constructor es el lugar perfecto para configurar propiedades, validar datos de entrada, y ejecutar cualquier lógica de inicialización que necesites.

Ejecución automática

El constructor se ejecuta automáticamente cada vez que usas new NombreClase(). No necesitas ni puedes llamarlo manualmente. JavaScript lo invoca por ti y pasa los argumentos que proporcionaste.

Constructor Básico

La sintaxis del constructor es simple: defines un método llamado constructor dentro del cuerpo de la clase. Este método puede recibir parámetros que usarás para inicializar las propiedades del objeto mediante la palabra clave this.

constructor-basico.js
Loading code...

En este ejemplo, el constructor recibe nombre y edad como parámetros y los asigna a las propiedades del objeto usando this. También inicializa una propiedad fechaCreacion con la fecha actual. Cada vez que creas una nueva instancia con new Persona(), el constructor se ejecuta y configura estas propiedades.

La palabra clave this

Dentro del constructor, this se refiere a la nueva instancia que está siendo creada. Cuando asignas this.nombre = nombre, estás creando una propiedad nombre en el nuevo objeto y asignándole el valor del parámetro nombre. Esta es la forma estándar de inicializar propiedades en JavaScript.

Prevención de errores

Las clases previenen automáticamente el error común de olvidar new. Si intentas llamar una clase sin new, JavaScript lanza un TypeError. Esto es una mejora importante sobre las funciones constructoras tradicionales.

Parámetros por Defecto

Puedes definir valores por defecto para los parámetros del constructor usando la sintaxis de ES6. Estos valores se usan solo cuando no pasas el parámetro correspondiente al crear la instancia, haciendo tu clase más flexible y fácil de usar.

parametros-defecto.js
Loading code...

Este ejemplo muestra cómo usar parámetros por defecto en el constructor. Los parámetros rol y activo tienen valores predeterminados que se usan si no los proporcionas al crear la instancia. Esto permite crear objetos de forma más flexible sin tener que pasar todos los argumentos cada vez.

undefined activa el default

Es importante notar que pasar undefined explícitamente como argumento activa el valor por defecto, pero pasar null no lo hace. Si pasas null, la propiedad tendrá el valor null. Esta distinción es útil cuando quieres diferenciar entre "no pasado" y "explícitamente nulo".

Valores por defecto complejos

Los valores por defecto pueden ser expresiones complejas, no solo valores literales. Puedes usar llamadas a funciones, operaciones matemáticas, o cualquier expresión válida de JavaScript como valor por defecto.

Validación en el Constructor

El constructor es el lugar ideal para validar los datos de entrada antes de crear el objeto. Si los datos no son válidos, puedes lanzar un error que previene la creación de una instancia con estado incorrecto. Esto asegura que todos los objetos creados sean válidos desde el inicio.

validacion-constructor.js
Loading code...

Este ejemplo valida que el nombre no esté vacío, que el precio sea un número positivo, y que el stock no sea negativo. Si alguna validación falla, se lanza un error con un mensaje descriptivo. Esto previene la creación de objetos en estados inválidos y hace el código más robusto.

  • <strong>Validar tipos</strong>: Verifica que los parámetros sean del tipo correcto (number, string, etc.)
  • <strong>Validar rangos</strong>: Asegura que los valores estén dentro de rangos válidos (positivos, entre 0-100, etc.)
  • <strong>Validar formato</strong>: Comprueba que strings tengan el formato esperado (email, teléfono, etc.)
  • <strong>Validar presencia</strong>: Verifica que campos obligatorios no estén vacíos o undefined
  • <strong>Mensajes claros</strong>: Lanza errores con mensajes descriptivos que ayuden a identificar el problema

Fallar temprano

Es mejor que el constructor lance un error si los datos no son válidos, en lugar de crear un objeto en estado incorrecto. Esto sigue el principio "fail fast" y hace los bugs más fáciles de detectar y corregir.

Propiedades Calculadas

El constructor puede crear propiedades calculadas basadas en los parámetros recibidos. Estas propiedades se derivan de los valores de entrada y se inicializan automáticamente al crear la instancia, evitando que tengas que calcularlas manualmente cada vez.

propiedades-calculadas.js
Loading code...

En este ejemplo, el constructor de Rectangulo calcula automáticamente el área, perímetro y si es un cuadrado basándose en los parámetros ancho y alto. Estas propiedades calculadas se almacenan en el objeto para acceso rápido. La clase CuentaBancaria muestra cómo generar IDs únicos y almacenar metadatos como la fecha de creación.

Métodos auxiliares

Es común definir métodos auxiliares privados que el constructor llama para realizar cálculos complejos o generar valores. Esto mantiene el constructor limpio y legible mientras encapsula la lógica compleja en métodos separados con nombres descriptivos.

Cuándo calcular en el constructor

Calcula propiedades en el constructor cuando sus valores no cambien frecuentemente y el cálculo sea rápido. Para cálculos costosos o valores que cambian, considera usar getters o métodos en su lugar.

Clases sin Constructor

Si no defines un constructor explícitamente, JavaScript automáticamente proporciona uno vacío. Este constructor por defecto no hace nada, simplemente permite crear instancias de la clase. Sin embargo, las instancias no tendrán ninguna propiedad inicializada a menos que uses campos de clase.

sin-constructor.js
Loading code...

Este ejemplo muestra tres formas de inicializar propiedades: sin constructor (instancia vacía), con constructor vacío pero que inicializa propiedades, y usando campos de clase (una característica más moderna de JavaScript). Los campos de clase son una alternativa conveniente cuando no necesitas lógica compleja de inicialización.

Campos de clase vs constructor

Los campos de clase (propiedades declaradas directamente en el cuerpo de la clase) se ejecutan antes del constructor y son útiles para valores simples. El constructor es mejor cuando necesitas lógica condicional, validación, o cuando las propiedades dependen de parámetros.

Cuándo omitir el constructor

Omite el constructor solo cuando tu clase no necesita inicializar propiedades o cuando puedes usar campos de clase para todos los valores por defecto. En la mayoría de casos, un constructor explícito hace el código más claro.

Objetos de Configuración

Un patrón común y poderoso es pasar un objeto de configuración al constructor en lugar de múltiples parámetros individuales. Esto hace tu API más flexible, ya que el orden de los parámetros no importa y puedes agregar nuevas opciones sin romper el código existente.

constructor-objetos.js
Loading code...

Este ejemplo usa destructuring en el constructor para extraer propiedades del objeto de configuración, con valores por defecto para cada una. Este patrón es muy común en bibliotecas y frameworks porque permite gran flexibilidad: puedes pasar solo las opciones que necesitas cambiar y el resto usa valores por defecto.

  • <strong>Orden no importa</strong>: Las propiedades del objeto pueden estar en cualquier orden
  • <strong>Opciones claras</strong>: Los nombres de las propiedades son descriptivos y auto-documentados
  • <strong>Fácil de extender</strong>: Puedes agregar nuevas opciones sin cambiar la firma del constructor
  • <strong>Opcional por defecto</strong>: Puedes hacer el objeto completo opcional con = {}
  • <strong>Validación sencilla</strong>: Fácil validar opciones individuales después del destructuring

Cuándo usar objetos de configuración

Usa objetos de configuración cuando tienes más de 3-4 parámetros, cuando muchos parámetros son opcionales, o cuando esperas agregar más opciones en el futuro. Para 1-3 parámetros obligatorios, los parámetros regulares son más simples.

Resumen: Constructores en Clases

Conceptos principales:

  • El constructor se ejecuta automáticamente al crear una instancia
  • Se usa para inicializar propiedades y validar datos
  • Puede tener parámetros con valores por defecto
  • Si no lo defines, JavaScript usa un constructor vacío
  • Puedes calcular propiedades basadas en los parámetros
  • Los objetos de configuración dan mayor flexibilidad

Mejores prácticas:

  • Valida los datos en el constructor, lanza errores si son inválidos
  • Usa parámetros por defecto para valores opcionales
  • Usa objetos de configuración para más de 3-4 parámetros
  • Mantén el constructor simple, mueve lógica compleja a métodos
  • Inicializa todas las propiedades importantes en el constructor
  • Usa campos de clase para valores simples sin lógica