Command Palette

Search for a command to run...

Getters y Setters: Propiedades Computadas y Validación

Los getters y setters son métodos especiales en las clases de JavaScript que te permiten controlar cómo se accede y modifica el valor de una propiedad.

Lectura: 16 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Los getters son métodos especiales que devuelven el valor de una propiedad
  • Los setters son métodos especiales que asignan valor a una propiedad
  • Getters y setters permiten encapsular la lógica de acceso a propiedades
  • Puedes usar getters para crear propiedades calculadas
  • Los setters permiten validar datos antes de asignarlos
  • Getters y setters se definen con la palabra clave get y set

Introducción a Getters y Setters

Los getters y setters son métodos especiales en las clases de JavaScript que te permiten controlar cómo se accede y modifica el valor de una propiedad. A diferencia de las propiedades normales, los getters y setters ejecutan lógica personalizada cuando se lee o escribe una propiedad, permitiéndote validar datos, calcular valores o mantener estado interno privado.

Se definen con las palabras clave get y set dentro del cuerpo de la clase. Los getters no aceptan parámetros y devuelven un valor, mientras que los setters aceptan exactamente un parámetro y no devuelven nada. Al usar una propiedad con getter o setter, JavaScript automáticamente llama al método correspondiente, haciendo que la sintaxis se vea como acceso a propiedad normal.

Encapsulación

Los getters y setters son una forma de encapsulación en JavaScript. Te permiten ocultar la implementación interna y proporcionar una interfaz controlada para acceder y modificar propiedades, validando datos y protegiendo el estado del objeto.

¿Qué son Getters?

Un getter es un método especial que se invoca automáticamente cuando accedes a una propiedad. Se define con la palabra clave get dentro de la clase y no acepta parámetros. Los getters son útiles para crear propiedades calculadas que se derivan de otras propiedades, transformar datos antes de devolverlos, o implementar propiedades de solo lectura.

getter-basico.js
Loading code...

Este ejemplo muestra un getter llamado fullName en una clase. Cuando accedes a persona.fullName, JavaScript invoca automáticamente el getter y devuelve el nombre completo concatenando firstName y lastName. La sintaxis es idéntica a acceder una propiedad normal, pero detrás ejecuta lógica personalizada.

Propiedad calculada

Los getters son ideales para crear propiedades calculadas que se derivan de otras propiedades. Se recalculan automáticamente cada vez que accedes a ellas, garantizando que siempre devuelvan el valor más actualizado sin necesidad de sincronización manual.

¿Qué son Setters?

Un setter es un método especial que se invoca automáticamente cuando asignas un valor a una propiedad. Se define con la palabra clave set dentro de la clase y acepta exactamente un parámetro. Los setters son útiles para validar datos antes de asignarlos, ejecutar lógica adicional cuando cambia una propiedad, o mantener la consistencia del estado interno del objeto.

setter-basico.js
Loading code...

Este ejemplo muestra un setter para fullName que valida que el valor sea un string y contenga al menos un espacio. Si la validación falla, lanza un error descriptivo. Si la validación pasa, divide el nombre y actualiza firstName y lastName. La sintaxis de asignación es idéntica a una propiedad normal, pero ejecuta validación automática.

Validación de datos

Los setters son perfectos para validar datos antes de asignarlos. Puedes verificar tipos, rangos, formatos o cualquier condición personalizada. Si los datos no son válidos, lanza un error para prevenir estados inconsistentes en el objeto.

Getters y Setters Juntos

Los getters y setters se usan comúnmente juntos para crear propiedades virtuales que parecen normales pero tienen lógica personalizada de acceso y modificación. Esto te permite encapsular la implementación interna mientras mantienes una interfaz limpia y consistente. La propiedad se puede leer y escribir como cualquier otra, pero con control total sobre cómo se manejan los datos.

getter-setter-juntos.js
Loading code...

Este ejemplo combina un getter y un setter para la propiedad fullName. El getter devuelve el nombre completo concatenando firstName y lastName. El setter valida el valor recibido y, si es válido, divide el string y actualiza ambas propiedades. Desde fuera de la clase, fullName se comporta como una propiedad normal que puedes leer y escribir.

Propiedad virtual

Cuando usas getters y setters juntos, creas una propiedad virtual que no existe como campo almacenado en el objeto. Esto te permite cambiar la implementación interna sin afectar el código que usa la propiedad, manteniendo la compatibilidad de la API.

Validación de Datos

Los setters son excelentes para validar datos antes de asignarlos a propiedades. Puedes verificar que los valores sean del tipo correcto, que cumplan ciertas condiciones o que estén dentro de un rango aceptable. Esto previene que el objeto entre en un estado inválido y hace tu código más robusto al detectar errores tempranamente en lugar de permitir datos incorrectos.

  • <strong>Validación de tipo</strong>: Verificar que el valor sea del tipo correcto (string, number, etc.)
  • <strong>Validación de rango</strong>: Verificar que el valor esté dentro de un rango aceptable
  • <strong>Validación de formato</strong>: Verificar que el valor cumpla con un formato específico (email, URL, etc.)
  • <strong>Validación de longitud</strong>: Verificar que el valor tenga una longitud mínima o máxima
  • <strong>Validación de valores permitidos</strong>: Verificar que el valor sea uno de los valores permitidos
validacion-datos.js
Loading code...

Este ejemplo muestra una clase Usuario con múltiples setters que validan datos. El setter de edad verifica que sea un número entre 0 y 150. El setter de email valida que sea un string con arroba. Ambos usan campos privados por convención (prefijo _) para almacenar el valor real, mientras los getters y setters proporcionan la interfaz pública validada.

Lanzar errores

Cuando la validación falla, es una buena práctica lanzar un error con un mensaje descriptivo. Esto ayuda a los desarrolladores a identificar exactamente qué salió mal y cómo corregirlo, siguiendo el principio "fail fast" de detectar problemas lo antes posible.

Propiedades Calculadas

Los getters son ideales para crear propiedades calculadas que se derivan de otras propiedades. A diferencia de calcular valores en el constructor y almacenarlos, los getters recalculan el valor cada vez que accedes a la propiedad. Esto garantiza que siempre obtengas el valor más actualizado sin necesidad de sincronización manual cuando cambian las propiedades base.

propiedades-calculadas.js
Loading code...

Este ejemplo muestra una clase Rectangulo con propiedades calculadas. Los getters area, perimeter e isSquare calculan sus valores basándose en width y height. Cuando modificas width o height, los getters devuelven automáticamente los valores recalculados sin necesidad de actualizar nada manualmente. Esto mantiene la consistencia y elimina la posibilidad de valores desactualizados.

Valores siempre actualizados

Las propiedades calculadas con getters siempre devuelven el valor actual basado en las propiedades base. No necesitas actualizar manualmente los valores derivados cuando cambian las propiedades base, eliminando una fuente común de bugs por desincronización.

Propiedades de Solo Lectura

Un patrón común es definir un getter sin su setter correspondiente para crear propiedades de solo lectura. Estas propiedades se pueden leer pero no modificar directamente, lo que es útil para valores que deben calcularse, IDs únicos, timestamps de creación, o cualquier dato que no debería cambiar después de la inicialización.

propiedades-solo-lectura.js
Loading code...

Este ejemplo muestra una clase CuentaBancaria con propiedades de solo lectura. numeroCuenta y fechaCreacion tienen getters pero no setters, lo que las hace de solo lectura. Intentar asignarles un valor en modo no estricto no hace nada (la asignación es ignorada silenciosamente), y en modo estricto lanza un error. Esto protege datos críticos de modificaciones accidentales.

Inmutabilidad controlada

Las propiedades de solo lectura son ideales para exponer datos calculados o valores que no deben cambiar. Esto hace tu API más clara y previene errores al intentar modificar valores que deberían ser inmutables.

Patrón Backing Field

El patrón backing field usa una propiedad privada (por convención con prefijo _) para almacenar el valor real, mientras que getters y setters proporcionan la interfaz pública con validación. Esto separa el almacenamiento interno de la API pública, permitiéndote cambiar la implementación sin afectar el código que usa la clase.

backing-fields.js
Loading code...

Este ejemplo muestra el patrón backing field en acción. La clase Producto usa propiedades privadas _nombre, _precio y _descuento para almacenar los valores reales. Los getters y setters públicos proporcionan acceso controlado con validación. La propiedad calculada precioFinal accede a los backing fields para calcular el precio con descuento. Por convención, no debes acceder directamente a las propiedades con prefijo _ desde fuera de la clase.

Privacidad por convención

El prefijo _ es solo una convención en JavaScript que indica que una propiedad es privada y no debe accederse directamente. Técnicamente, estas propiedades siguen siendo accesibles, pero la convención comunica la intención de que son detalles internos de implementación. Para verdadera privacidad, JavaScript moderno ofrece campos privados con el prefijo # (que se cubrirán en otro artículo).

Prefijo _ es convención, no protección

El prefijo _ no hace que las propiedades sean realmente privadas, solo indica por convención que no deberían ser accedidas directamente. Siempre usa los getters y setters públicos para interactuar con estas propiedades desde fuera de la clase.

Resumen: Getters y Setters

Conceptos principales:

  • Los getters son métodos que se ejecutan al leer una propiedad
  • Los setters son métodos que se ejecutan al asignar una propiedad
  • Se definen con las palabras clave get y set en clases
  • Los getters crean propiedades calculadas siempre actualizadas
  • Los setters permiten validar datos antes de asignarlos
  • El patrón backing field usa _ para propiedades privadas por convención

Mejores prácticas:

  • Usa getters para propiedades calculadas que cambian con el estado
  • Usa setters para validar y lanzar errores con datos inválidos
  • Combina getter y setter para propiedades virtuales con lógica
  • Usa solo getter para crear propiedades de solo lectura
  • Usa backing fields (_propiedad) para separar almacenamiento de API
  • Evita lógica compleja o costosa en getters que se llaman frecuentemente