Lección 46: Getters, Setters y Miembros Estáticos
🧠 Concepto
Section titled “🧠 Concepto”Las clases en JavaScript soportan getters, setters (propiedades computadas) y miembros estáticos (métodos y propiedades de clase, no de instancia).
Getters y Setters
Section titled “Getters y Setters”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'; // setterconsole.log(usuario.nombre); // "Luis"console.log(usuario.apellido); // "Pérez"Miembros estáticos (static)
Section titled “Miembros estáticos (static)”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.14159console.log(Matemáticas.sumar(5, 3)); // 8console.log(Matemáticas.esPar(4)); // true
// No están disponibles en instanciasconst m = new Matemáticas();console.log(m.PI); // undefined// m.sumar(1, 2); // TypeError: m.sumar is not a function💻 Ejemplo
Section titled “💻 Ejemplo”// Contador de instancias con staticclass 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()); // 3console.log(p1.precioFormateado); // "$1000.00"
// Uso del setter con validación// p3.precio = -10; // Error: El precio no puede ser negativo⚠️ Nota
Section titled “⚠️ Nota”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); // 32temp.fahrenheit = 212;console.log(temp.celsius); // 100Los 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
📝 Ejercicio
Section titled “📝 Ejercicio”Crea una clase CuentaBancaria con:
- Propiedad privada
_saldo(inicia en 0) - Getter
saldoque devuelva el saldo - Setter
saldoque 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); // 100cuenta.saldo = 50;console.log(cuenta.saldo); // 50// cuenta.saldo = -10; // Errorconsole.log(CuentaBancaria.tipoCambio()); // "EUR/USD: 1.08"