Skip to content

Lección 46: Getters, Setters y Miembros Estáticos

Las clases en JavaScript soportan getters, setters (propiedades computadas) y miembros estáticos (métodos y propiedades de clase, no de instancia).

Permiten definir propiedades que se comportan como si fueran propiedades normales pero con lógica personalizada:

class Usuario {
constructor(nombre, apellido) {
this.nombre = nombre;
this.apellido = apellido;
}
// Getter
get nombreCompleto() {
return `${this.nombre} ${this.apellido}`;
}
// Setter
set nombreCompleto(valor) {
const partes = valor.split(' ');
this.nombre = partes[0];
this.apellido = partes.slice(1).join(' ');
}
}
const usuario = new Usuario('Ana', 'García');
console.log(usuario.nombreCompleto); // "Ana García" (getter, sin paréntesis)
usuario.nombreCompleto = 'Luis Pérez'; // setter
console.log(usuario.nombre); // "Luis"
console.log(usuario.apellido); // "Pérez"

Se definen con la palabra static y pertenecen a la clase, no a las instancias:

class Matemáticas {
static PI = 3.14159;
static sumar(a, b) {
return a + b;
}
static esPar(numero) {
return numero % 2 === 0;
}
}
console.log(Matemáticas.PI); // 3.14159
console.log(Matemáticas.sumar(5, 3)); // 8
console.log(Matemáticas.esPar(4)); // true
// No están disponibles en instancias
const m = new Matemáticas();
console.log(m.PI); // undefined
// m.sumar(1, 2); // TypeError: m.sumar is not a function
// Contador de instancias con static
class Producto {
static contador = 0;
constructor(nombre, precio) {
this.nombre = nombre;
this.precio = precio;
Producto.contador++;
}
static getTotalProductos() {
return Producto.contador;
}
// Getter para precio formateado
get precioFormateado() {
return `$${this.precio.toFixed(2)}`;
}
// Setter con validación
set precio(nuevoPrecio) {
if (nuevoPrecio < 0) {
throw new Error('El precio no puede ser negativo');
}
this._precio = nuevoPrecio;
}
get precio() {
return this._precio;
}
}
const p1 = new Producto('Laptop', 1000);
const p2 = new Producto('Mouse', 25);
const p3 = new Producto('Teclado', 75);
console.log(Producto.getTotalProductos()); // 3
console.log(p1.precioFormateado); // "$1000.00"
// Uso del setter con validación
// p3.precio = -10; // Error: El precio no puede ser negativo

Los getters y setters permiten usar propiedades con lógica sin cambiar la interfaz. Si empiezas con una propiedad simple y luego necesitas validación, conviértela a getter/setter sin romper el código existente:

class Temperatura {
constructor(celsius) {
this._celsius = celsius;
}
get fahrenheit() {
return this._celsius * 9/5 + 32;
}
set fahrenheit(valor) {
this._celsius = (valor - 32) * 5/9;
}
get celsius() {
return this._celsius;
}
}
const temp = new Temperatura(0);
console.log(temp.fahrenheit); // 32
temp.fahrenheit = 212;
console.log(temp.celsius); // 100

Los miembros estáticos no acceden a this de instancia. Dentro de un método estático, this se refiere a la clase misma.

Usa getters/setters cuando quieras:

  • Calcular propiedades dinámicamente
  • Validar datos al asignar
  • Mantener compatibilidad (cambiar propiedad simple a computada)

Usa static para:

  • Contadores de instancias
  • Métodos de utilidad (factory methods, validación)
  • Constantes relacionadas con la clase
  • Singleton pattern

Crea una clase CuentaBancaria con:

  • Propiedad privada _saldo (inicia en 0)
  • Getter saldo que devuelva el saldo
  • Setter saldo que valide que no sea negativo
  • Método estático tipoCambio() que devuelva “EUR/USD: 1.08”
  • Método estático crearCuenta(saldoInicial) que cree una nueva cuenta con saldo inicial
class CuentaBancaria {
// Escribe aquí
}
const cuenta = CuentaBancaria.crearCuenta(100);
console.log(cuenta.saldo); // 100
cuenta.saldo = 50;
console.log(cuenta.saldo); // 50
// cuenta.saldo = -10; // Error
console.log(CuentaBancaria.tipoCambio()); // "EUR/USD: 1.08"