Introducción
En JavaScript, los prototipos son una característica fundamental que permite la herencia y la reutilización de código. A diferencia de otros lenguajes de programación orientados a objetos que utilizan clases, JavaScript utiliza prototipos para implementar la herencia.
Objetivos de esta sección:
- Comprender qué es un prototipo en JavaScript.
- Aprender cómo funciona la herencia prototípica.
- Implementar ejemplos prácticos de herencia utilizando prototipos.
- Conocer los errores comunes y cómo evitarlos.
¿Qué es un Prototipo?
Un prototipo es un objeto del cual otros objetos heredan propiedades y métodos. Cada objeto en JavaScript tiene un prototipo, y este prototipo también puede tener un prototipo, formando una cadena conocida como "cadena de prototipos".
Ejemplo Básico de Prototipo
function Persona(nombre, edad) { this.nombre = nombre; this.edad = edad; } Persona.prototype.saludar = function() { console.log(`Hola, mi nombre es ${this.nombre} y tengo ${this.edad} años.`); }; const juan = new Persona('Juan', 30); juan.saludar(); // Hola, mi nombre es Juan y tengo 30 años.
En este ejemplo:
Persona
es una función constructora.Persona.prototype.saludar
es un método que todos los objetos creados connew Persona
pueden usar.
Herencia Prototípica
La herencia prototípica permite que un objeto herede propiedades y métodos de otro objeto. Esto se logra asignando el prototipo de un objeto a otro objeto.
Ejemplo de Herencia Prototípica
function Estudiante(nombre, edad, curso) { Persona.call(this, nombre, edad); this.curso = curso; } // Establecer la herencia Estudiante.prototype = Object.create(Persona.prototype); Estudiante.prototype.constructor = Estudiante; Estudiante.prototype.estudiar = function() { console.log(`${this.nombre} está estudiando ${this.curso}.`); }; const maria = new Estudiante('Maria', 22, 'Matemáticas'); maria.saludar(); // Hola, mi nombre es Maria y tengo 22 años. maria.estudiar(); // Maria está estudiando Matemáticas.
En este ejemplo:
Estudiante
hereda dePersona
usandoObject.create(Persona.prototype)
.Estudiante.prototype.constructor
se reasigna aEstudiante
para mantener la referencia correcta al constructor.
Ejercicio Práctico
Ejercicio 1: Crear una Jerarquía de Herencia
- Crea una función constructora
Animal
con propiedadesnombre
yespecie
. - Añade un método
hacerSonido
al prototipo deAnimal
. - Crea una función constructora
Perro
que herede deAnimal
y añade una propiedadraza
. - Añade un método
ladrar
al prototipo dePerro
.
Solución
function Animal(nombre, especie) { this.nombre = nombre; this.especie = especie; } Animal.prototype.hacerSonido = function() { console.log(`${this.nombre} hace un sonido.`); }; function Perro(nombre, especie, raza) { Animal.call(this, nombre, especie); this.raza = raza; } Perro.prototype = Object.create(Animal.prototype); Perro.prototype.constructor = Perro; Perro.prototype.ladrar = function() { console.log(`${this.nombre} está ladrando.`); }; const rex = new Perro('Rex', 'Canino', 'Labrador'); rex.hacerSonido(); // Rex hace un sonido. rex.ladrar(); // Rex está ladrando.
Errores Comunes y Consejos
-
Olvidar reasignar el constructor: Después de establecer la herencia con
Object.create
, es importante reasignar el constructor.Perro.prototype.constructor = Perro;
-
No usar
call
para heredar propiedades: Al heredar propiedades del constructor padre, usacall
para asegurarte de que las propiedades se asignen correctamente.Animal.call(this, nombre, especie);
-
Modificar el prototipo directamente: Evita modificar el prototipo directamente después de crear instancias, ya que esto puede causar problemas de rendimiento y errores inesperados.
Conclusión
En esta sección, hemos aprendido sobre los prototipos y la herencia en JavaScript. Los prototipos permiten la reutilización de código y la creación de jerarquías de objetos. La herencia prototípica es una herramienta poderosa que, cuando se usa correctamente, puede hacer que tu código sea más modular y fácil de mantener.
Próximos Pasos
En la siguiente sección, exploraremos las clases en JavaScript y cómo proporcionan una sintaxis más limpia y moderna para trabajar con la herencia y los prototipos.
JavaScript: De Principiante a Avanzado
Módulo 1: Introducción a JavaScript
- ¿Qué es JavaScript?
- Configuración de tu Entorno de Desarrollo
- Tu Primer Programa en JavaScript
- Sintaxis y Conceptos Básicos de JavaScript
- Variables y Tipos de Datos
- Operadores Básicos
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for, while, do-while
- Sentencias Switch
- Manejo de Errores con try-catch
Módulo 3: Funciones
- Definición y Llamada de Funciones
- Expresiones de Función y Funciones Flecha
- Parámetros y Valores de Retorno
- Ámbito y Closures
- Funciones de Orden Superior
Módulo 4: Objetos y Arrays
- Introducción a los Objetos
- Métodos de Objeto y la Palabra Clave 'this'
- Arrays: Conceptos Básicos y Métodos
- Iteración sobre Arrays
- Desestructuración de Arrays
Módulo 5: Objetos y Funciones Avanzadas
- Prototipos y Herencia
- Clases y Programación Orientada a Objetos
- Módulos e Importación/Exportación
- JavaScript Asíncrono: Callbacks
- Promesas y Async/Await
Módulo 6: El Modelo de Objetos del Documento (DOM)
- Introducción al DOM
- Selección y Manipulación de Elementos del DOM
- Manejo de Eventos
- Creación y Eliminación de Elementos del DOM
- Manejo y Validación de Formularios
Módulo 7: APIs del Navegador y Temas Avanzados
- Almacenamiento Local y de Sesión
- Fetch API y AJAX
- WebSockets
- Service Workers y Aplicaciones Web Progresivas (PWAs)
- Introducción a WebAssembly
Módulo 8: Pruebas y Depuración
- Depuración de JavaScript
- Pruebas Unitarias con Jest
- Pruebas de Integración
- Pruebas de Extremo a Extremo con Cypress
Módulo 9: Rendimiento y Optimización
- Optimización del Rendimiento de JavaScript
- Gestión de Memoria
- Manipulación Eficiente del DOM
- Carga Perezosa y División de Código
Módulo 10: Frameworks y Librerías de JavaScript
- Introducción a React
- Gestión de Estado con Redux
- Conceptos Básicos de Vue.js
- Conceptos Básicos de Angular
- Elegir el Framework Adecuado