JavaScript de Cero a Experto / POO en JS
this a fondo: las cuatro reglas, de una vez
Desde el módulo 5 vives con la regla corta: "this es el objeto antes del
punto". Hoy se cumple la promesa de la versión completa: las CUATRO reglas
que deciden qué es this en cualquier código JavaScript — incluida la del
bug más famoso del lenguaje y la razón exacta por la que una arrow function
jamás debe ser un método.
La palabra "mi"
Las cuatro reglas
En orden de prioridad cuando se combinan: new gana, luego el objeto
antes del punto, y sin nada de eso, undefined (en módulos y clases —
código moderno; en scripts viejos y "sueltos" era el objeto global
window, fuente de bugs legendarios). La arrow no compite: ella ya trae
su this de fábrica, del entorno donde fue escrita.
El bug del millón: el this perdido
La regla 2 ataca donde menos lo esperas: cada vez que ENTREGAS un método
como callback. setTimeout, addEventListener, map… reciben tu función
y la llaman ellos — sin objeto antes del punto:
Míralo con la analogía: la function normal que le entregaste a
setTimeout será pronunciada por OTRO actor (el timer), y su "mi" ya no
es tu bolsillo. La arrow, en cambio, es cita textual: se escribió DENTRO
del método recordarBien — donde this era el bolsillo — y ese this se
va con ella a donde vaya. Por eso la regla práctica del módulo 5 ahora
tiene su porqué completo:
- Arrow como MÉTODO: nunca. El método necesita jugar el juego del punto, y la arrow no juega.
- Arrow como CALLBACK dentro de un método: siempre. Ahí quieres
conservar el
thisde afuera, y eso es exactamente lo que hace.
Última pieza del arsenal, por honestidad: existe metodo.bind(objeto),
que fabrica una copia de la función con el this fijado para siempre
(y sus primas call/apply, que llaman una vez con el this que
indiques). Las verás en código ajeno, sobre todo anterior a las arrows;
hoy la arrow resuelve el 95% de los casos con menos ceremonia.
En tu clase escribes: boton.addEventListener('click', this.registrar) — y al hacer clic, registrar explota con 'Cannot read properties of undefined'. ¿Por qué?
Mini-reto
Caza el bug con tus manos: crea una clase Contador con this.clics = 0
y un método conectar(boton) que registre un listener sumando clics e
imprimiendo el total. Escríbelo primero con function normal como
callback (mira el error en frío), luego cúralo con arrow, y de postre
inténtalo con .bind(this). Tres versiones del mismo listener: ya puedes
explicar en una entrevista por qué solo dos funcionan.
Qué sigue
Dijimos que los métodos del molde "se comparten entre todas las instancias" — pero ¿DÓNDE viven exactamente, si no están copiados en cada objeto? La respuesta es la maquinaria secreta debajo de todo JavaScript: los PROTOTIPOS. La próxima lección los destapa sin miedo — y de paso resuelve misterios que arrastras desde el módulo 5.