En aquest tema, explorarem dos conceptes fonamentals en JavaScript: els prototips i la herència. Aquests conceptes són essencials per entendre com funciona la programació orientada a objectes (OOP) en JavaScript.
Què és un Prototip?
En JavaScript, cada objecte té una propietat interna anomenada [[Prototype]]. Aquesta propietat és una referència a un altre objecte, conegut com a prototip. Quan es busca una propietat o mètode en un objecte, JavaScript primer busca en l'objecte mateix. Si no troba la propietat o mètode, busca en el prototip de l'objecte, i així successivament fins arribar al final de la cadena de prototips.
Exemple de Prototip
let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // Estableix animal com a prototip de rabbit
console.log(rabbit.eats); // true (heretat de animal)
console.log(rabbit.jumps); // true (propi de rabbit)Explicació
- Creació d'Objectes: Hem creat dos objectes,
animalirabbit. - Establiment del Prototip: Hem establert
animalcom a prototip derabbitutilitzant la propietat__proto__. - Herència de Propietats: Quan accedim a
rabbit.eats, JavaScript no troba aquesta propietat enrabbiti la busca en el seu prototip,animal.
Herència en JavaScript
La herència permet crear nous objectes basats en objectes existents, heretant les seves propietats i mètodes. Això es fa mitjançant la cadena de prototips.
Exemple d'Herència
function Animal(name) {
this.name = name;
this.canWalk = true;
}
Animal.prototype.eat = function() {
console.log(`${this.name} is eating.`);
};
function Rabbit(name) {
Animal.call(this, name); // Hereta les propietats de Animal
this.canJump = true;
}
Rabbit.prototype = Object.create(Animal.prototype); // Hereta els mètodes de Animal
Rabbit.prototype.constructor = Rabbit;
Rabbit.prototype.jump = function() {
console.log(`${this.name} is jumping.`);
};
let rabbit = new Rabbit('Bunny');
rabbit.eat(); // Bunny is eating.
rabbit.jump(); // Bunny is jumping.
console.log(rabbit.canWalk); // true
console.log(rabbit.canJump); // trueExplicació
- Funció Constructora: Hem creat una funció constructora
Animalque defineix les propietatsnameicanWalk. - Mètodes del Prototip: Hem afegit un mètode
eatal prototip deAnimal. - Herència de Propietats: La funció constructora
Rabbitcrida aAnimal.call(this, name)per heretar les propietats deAnimal. - Herència de Mètodes: Hem establert
Rabbit.prototypecom a objecte creat a partir deAnimal.prototypeper heretar els mètodes. - Mètodes Propis: Hem afegit un mètode
jumpal prototip deRabbit.
Exercicis Pràctics
Exercici 1: Crear una Cadena de Prototips
Crea una cadena de prototips on dog hereti de animal i animal hereti de livingBeing.
let livingBeing = {
isAlive: true
};
let animal = {
__proto__: livingBeing,
canBreathe: true
};
let dog = {
__proto__: animal,
barks: true
};
console.log(dog.isAlive); // true
console.log(dog.canBreathe); // true
console.log(dog.barks); // trueExercici 2: Funcions Constructores i Herència
Crea una funció constructora Vehicle amb les propietats make i model. Crea una funció constructora Car que hereti de Vehicle i afegeixi la propietat numDoors.
function Vehicle(make, model) {
this.make = make;
this.model = model;
}
Vehicle.prototype.start = function() {
console.log(`${this.make} ${this.model} is starting.`);
};
function Car(make, model, numDoors) {
Vehicle.call(this, make, model);
this.numDoors = numDoors;
}
Car.prototype = Object.create(Vehicle.prototype);
Car.prototype.constructor = Car;
Car.prototype.honk = function() {
console.log(`${this.make} ${this.model} is honking.`);
};
let myCar = new Car('Toyota', 'Corolla', 4);
myCar.start(); // Toyota Corolla is starting.
myCar.honk(); // Toyota Corolla is honking.
console.log(myCar.numDoors); // 4Errors Comuns i Consells
- Oblidar Establir el Constructor: Després de crear un nou prototip amb
Object.create, assegura't de restablir la propietatconstructor. - No Utilitzar
callper Heretar Propietats: Quan crides a la funció constructora del pare, utilitzacallper assegurar-te que les propietats es copien correctament. - Confusió amb
__proto__: És millor utilitzarObject.createper establir prototips en lloc de__proto__per evitar problemes de compatibilitat.
Resum
En aquest tema, hem après sobre els prototips i la herència en JavaScript. Hem vist com els objectes poden heretar propietats i mètodes a través de la cadena de prototips i com utilitzar funcions constructores per implementar herència. Aquests conceptes són fonamentals per a la programació orientada a objectes en JavaScript i ens permeten crear estructures de codi més reutilitzables i organitzades.
JavaScript: De Principiant a Avançat
Mòdul 1: Introducció a JavaScript
- Què és JavaScript?
- Configuració del Teu Entorn de Desenvolupament
- El Teu Primer Programa en JavaScript
- Sintaxi i Conceptes Bàsics de JavaScript
- Variables i Tipus de Dades
- Operadors Bàsics
Mòdul 2: Estructures de Control
- Declaracions Condicionals
- Bucles: for, while, do-while
- Declaracions Switch
- Gestió d'Errors amb try-catch
Mòdul 3: Funcions
- Definició i Crida de Funcions
- Expressions de Funció i Funcions Fletxa
- Paràmetres i Valors de Retorn
- Àmbit i Tancaments
- Funcions d'Ordre Superior
Mòdul 4: Objectes i Arrays
- Introducció als Objectes
- Mètodes d'Objecte i Paraula Clau 'this'
- Arrays: Conceptes Bàsics i Mètodes
- Iteració sobre Arrays
- Desestructuració d'Arrays
Mòdul 5: Objectes i Funcions Avançades
- Prototips i Herència
- Classes i Programació Orientada a Objectes
- Mòduls i Importació/Exportació
- JavaScript Asíncron: Callbacks
- Promeses i Async/Await
Mòdul 6: El Model d'Objectes del Document (DOM)
- Introducció al DOM
- Selecció i Manipulació d'Elements del DOM
- Gestió d'Esdeveniments
- Creació i Eliminació d'Elements del DOM
- Gestió i Validació de Formularis
Mòdul 7: APIs del Navegador i Temes Avançats
- Emmagatzematge Local i de Sessió
- Fetch API i AJAX
- WebSockets
- Service Workers i Aplicacions Web Progressives (PWAs)
- Introducció a WebAssembly
Mòdul 8: Proves i Depuració
- Depuració de JavaScript
- Proves Unitàries amb Jest
- Proves d'Integració
- Proves de Cap a Cap amb Cypress
Mòdul 9: Rendiment i Optimització
- Optimització del Rendiment de JavaScript
- Gestió de Memòria
- Manipulació Eficient del DOM
- Càrrega Per Mandat i Divisió de Codi
Mòdul 10: Frameworks i Llibreries de JavaScript
- Introducció a React
- Gestió d'Estat amb Redux
- Conceptes Bàsics de Vue.js
- Conceptes Bàsics d'Angular
- Triar el Framework Adequat
