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:
Personaes una función constructora.Persona.prototype.saludares un método que todos los objetos creados connew Personapueden 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:
Estudiantehereda dePersonausandoObject.create(Persona.prototype).Estudiante.prototype.constructorse reasigna aEstudiantepara mantener la referencia correcta al constructor.
Ejercicio Práctico
Ejercicio 1: Crear una Jerarquía de Herencia
- Crea una función constructora
Animalcon propiedadesnombreyespecie. - Añade un método
hacerSonidoal prototipo deAnimal. - Crea una función constructora
Perroque herede deAnimaly añade una propiedadraza. - Añade un método
ladraral 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
callpara heredar propiedades: Al heredar propiedades del constructor padre, usacallpara 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
