CodeForge

JavaScript de Cero a Experto / POO en JS

Campos privados: el candado #

Teoría18 min20 XP

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 como total — 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.