CodeForge

JavaScript de Cero a Experto / POO en JS

Prototipos sin miedo: la maquinaria bajo las clases

Teoría20 min20 XP

"Prototipo" es la palabra que más asusta de JavaScript — y hoy pierde el misterio. Es apenas esto: cuando le pides a un objeto algo que no tiene, JavaScript lo busca en OTRO objeto de respaldo. De esa idea simple cuelga todo el lenguaje: tus clases, los métodos de array que usas a diario, y un par de misterios que arrastras desde el módulo 5.

El manual compartido

Sigue la búsqueda de a.esCaro(): JavaScript mira la libreta de a (no está), sube al manual Gasto.prototype (¡ahí está!) y la ejecuta con this = a — la regla 1 de la lección pasada, intacta. Por eso a.esCaro === b.esCaro es true: mil instancias, UNA función. El molde de la lección 1 por fin muestra su mecanismo: class es la forma bonita de poner métodos en un prototipo compartido.

Los misterios resueltos

Con la cadena en la mano, se destapan casos que llevas meses usando:

El famoso "[object Object]" del módulo 5 era esto: al convertir un objeto a texto, JavaScript sube por la cadena, encuentra el toString genérico de Object.prototype, y ese devuelve su saludo inútil. Y cada map, filter, toUpperCase que has escrito era una consulta al manual de su estación — Array.prototype, String.prototype. Los prototipos no eran un tema nuevo: eran el suelo que ya pisabas.

Nota honesta de oficio: hoy casi nunca tocarás prototipos DIRECTAMENTE — las clases son la interfaz moderna y con ellas te basta. Entenderlos te sirve para tres cosas reales: depurar (el inspector te muestra la cadena al expandir cualquier objeto), leer código anterior a 2015 (verás Gasto.prototype.esCaro = function... — mismo mecanismo, sintaxis vieja), y responder LA pregunta de entrevista. Modificar Array.prototype u Object.prototype a mano, jamás: es sabotear el manual general de todos.

En una entrevista te preguntan: si creas 1.000 instancias con new Gasto(...), ¿cuántas copias del método esCaro existen en memoria?

Mini-reto

Explora la cadena con tus manos: 1) crea un array y recorre su cadena de prototipos con el while del playground — ¿cuántos eslabones tiene y cómo se llaman?; 2) comprueba con Object.hasOwn que length SÍ es propio del array pero push no; 3) el experimento estrella: dale a tu clase Gasto un toString() propio que devuelva el resumen del gasto, y comprueba que `${gasto}` en un template literal ahora imprime algo útil — acabas de TAPAR el método del manual general con uno de tu estación. Ese fenómeno tiene nombre, y es el tema de la próxima lección.

Qué sigue

"Tapar" un método del respaldo con uno propio es la semilla de algo más grande: moldes que EXTIENDEN moldes. Un Movimiento general, y sobre él Gasto e Ingreso que heredan lo común y redefinen lo suyo. Próxima lección: herencia con extends, super e instanceof.