JavaScript de Cero a Experto / POO en JS
Campos privados: el candado #
El guion bajo de la lección pasada era una súplica: "por favor no toques
esto". Hoy instalas la ley: campos privados con # — propiedades que
literalmente NO EXISTEN desde afuera de la clase. Con ellos, tus objetos
dejan de ser cajas abiertas y se vuelven máquinas con panel de control.
La cocina y el menú
Fíjate en la garantía nueva: TODO movimiento que viva en #movimientos
pasó por #validar — no porque confíes en que los demás usen bien la
clase, sino porque no hay otro camino físico. Esa propiedad que el
sistema completo puede dar por hecha ("aquí nunca hay gastos negativos")
se llama invariante, y protegerla es la razón de ser de la encapsulación.
El _guionBajo pedía; el # garantiza.
Diseñar la API pública: menos es más
Con privados disponibles, cada pieza de tu clase exige una decisión: ¿menú o cocina? La guía profesional:
- Privado por defecto. Todo lo que puedas esconder, escóndelo: cada cosa pública es un compromiso que deberás mantener para siempre (alguien la estará usando).
- Público, solo el contrato: las operaciones que el exterior necesita
(
agregar), y las vistas de solo lectura (getters comototal— nota que expone el NÚMERO calculado, jamás el array interno). - Los detalles de implementación, jamás: si mañana cambias el array
por un
Map, ningún código externo debería enterarse. Eso es libertad de remodelar la cocina sin avisarle a los clientes.
Nota honesta de contexto: el # es relativamente nuevo (2022 en todos los
navegadores), así que en código existente verás toneladas de _convención
haciendo este papel de palabra. Y TypeScript — tu próximo supercurso —
trae su propio private, que valida al compilar aunque no ponga candado
en ejecución; el # funciona en ambos mundos.
Tu Bolsillo expone get movimientos() { return this.#movimientos; } para que la UI pinte la lista... y un día descubres gastos con valor negativo adentro, aunque agregar() valida todo. ¿Cómo se colaron?
Mini-reto
Blinda tu clase: toma el Bolsillo del playground y 1) agrega
get historial() que devuelva una COPIA del array (spread) — comprueba
que hacerle push a lo que recibes NO afecta el total; 2) agrega un
método público retirar(valor) que use un privado #hayFondos(valor)
contra el disponible (throw si no alcanza); 3) intenta leer
b.#presupuesto desde afuera y aprécialo: ni error de ejecución — error
de SINTAXIS, el código ni arranca. Ese es el candado más firme que ofrece
el lenguaje.
Qué sigue
Tienes el arsenal completo de la POO en JavaScript: moldes, this,
prototipos, herencia, getters, static y privados. El reto del módulo los
junta en la pieza central del proyecto: la clase Bolsillo definitiva —
con su versión extendida, su fábrica estática y sus invariantes
protegidos. A forjar.