Los prototipos en JavaScript permiten que múltiples objetos compartan métodos sin duplicar código. Con funciones constructoras, el operador new, la referencia this y la propiedad prototype, se logra un diseño más eficiente en memoria y fácil de mantener. Aquí verás, con ejemplos prácticos en consola, cómo evitar copias innecesarias de métodos como saludar y cómo inspeccionar relaciones con Object.getPrototypeOf e instanceof.
¿Qué son los prototipos en JavaScript y por qué optimizan memoria?
Imagina una fábrica de teléfonos: todos pueden llamar, enviar mensajes y tomar fotos. Sería ineficiente reprogramar cada función en cada equipo. Así actúan los prototipos: un “sistema operativo” común que comparte métodos entre instancias. En JavaScript, los objetos creados desde una misma función constructora pueden usar los mismos métodos definidos en su prototype.
Métodos compartidos: evitan duplicar lógica en cada objeto.
Menor uso de memoria: una sola función para todas las instancias.
Mantenimiento más simple: cambios en un punto común.
¿Qué problema genera duplicar métodos?
Si defines el método dentro del constructor, cada objeto crea su propia copia. Comparar con triple igualdad (===) entre dos métodos de instancias distintas devuelve false, evidenciando la duplicación.
functionpersona(nombre, edad){this.nombre= nombre;this.edad= edad;this.saludar=function(){console.log(`Hola, soy ${this.nombre} y tengo ${this.edad} años`);};}const maria =newpersona('María',30);const carlos =newpersona('Carlos',25);console.log(maria.saludar=== carlos.saludar);// false (cada uno tiene su copia)
¿Cómo crear constructores y métodos sin duplicados con prototype?
La práctica recomendada es definir propiedades en la función constructora y métodos en el prototype. Así, todas las instancias comparten la misma referencia al método.
functionpersona(nombre, edad){this.nombre= nombre;this.edad= edad;}persona.prototype.saludar=function(){console.log(`Hola, soy ${this.nombre} y tengo ${this.edad} años`);};const ana =newpersona('Ana',28);const luis =newpersona('Luis',32);console.log(ana.saludar=== luis.saludar);// true (mismo método compartido)
Define propiedades con this en el constructor.
Agrega métodos a persona.prototype una sola vez.
Reutiliza la misma función entre todas las instancias.
¿Cómo evitar errores con this y nombres de propiedades?
Un desajuste como usar this.name en el método y this.nombre en el constructor provoca undefined. Asegura consistencia de nombres.
Mantén el mismo identificador en propiedades y métodos.
Verifica en consola con console.log el valor de this.
Evita cambios entre español e inglés en nombres de propiedades.
¿Cómo inspeccionar el prototype y validar relaciones con Object.getPrototypeOf e instanceof?
Además de compartir métodos, necesitas verificar la cadena de prototipos y la relación entre instancias y sus constructores. Con Object.getPrototypeOf obtienes el prototipo real de un objeto. Con instanceof validas si un objeto fue creado por un constructor específico.
functionanimal(nombre){this.nombre= nombre;}animal.prototype.comer=function(){console.log(`${this.nombre} está comiendo`);};const gato =newanimal('Gato');const proto =Object.getPrototypeOf(gato);console.log(proto === animal.prototype);// true (apunta al mismo prototype)console.log(gato instanceofanimal);// true (gato fue creado con animal)
Usa Object.getPrototypeOf(obj) para leer el prototipo actual.
Compara con Constructor.prototype para confirmar igualdad.
Valida con instanceof la relación instancia-constructor.
Centraliza métodos como comer en el prototype para reutilizarlos.
¿Te quedó alguna duda o quieres compartir tu ejemplo usando prototype, Object.getPrototypeOf o instanceof? Escribe tu comentario y conversemos sobre buenas prácticas con prototipos en JavaScript.