7.1 Fondamenti dell'ereditarietà
L'ereditarietà delle classi in JavaScript permette di creare nuove classi basate su classi esistenti, riutilizzando ed estendendo la loro funzionalità. Questo è un aspetto fondamentale della programmazione orientata agli oggetti (OOP), che consente di creare gerarchie di classi e gestire il comportamento degli oggetti.
Per l'ereditarietà delle classi si utilizza la parola chiave extends. La classe che eredita un'altra classe si chiama classe derivata (subclass), e la classe da cui deriva si chiama classe base (superclass).
Esempio:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
Spiegazione:
- La classe
Animalè la classe base con un costruttore e un metodospeak() - La classe
Dogeredita daAnimale ridefinisce il metodospeak() - L'istanza
dogdella classeDogutilizza il metodo ridefinitospeak()
7.2 La parola chiave super
La parola chiave super viene utilizzata per chiamare il costruttore o i metodi della classe base dalla classe derivata.
1. Chiamata del costruttore della classe base
La classe derivata deve chiamare il costruttore della classe base usando super() prima di usare this.
Esempio:
Il costruttore Dog chiama super(name) per inizializzare la proprietà name della classe base Animal.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'Labrador');
console.log(dog.name); // "Rex"
console.log(dog.breed); // "Labrador"
dog.speak(); // "Rex barks."
2. Chiamata dei metodi della classe base
I metodi della classe base possono essere chiamati dalla classe derivata usando super.
Esempio:
Il metodo speak() della classe Dog chiama il metodo speak() della classe base Animal utilizzando super.speak(), e poi esegue la propria logica.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
super.speak(); // Chiamata del metodo della classe base
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak();
// "Rex makes a noise."
// "Rex barks."
7.3 Ereditarietà e ridefinizione dei metodi
L'ereditarietà permette alle classi derivate di ridefinire i metodi della classe base. Questo consente di modificare o espandere la funzionalità dei metodi.
Esempio:
Il metodo speak() della classe Dog ridefinisce il metodo speak() della classe base Animal, fornendo la propria implementazione.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const animal = new Animal('Generic Animal');
animal.speak(); // "Generic Animal makes a noise."
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
7.4 Ereditarietà e metodi aggiuntivi
La classe derivata può aggiungere nuovi metodi non presenti nella classe base.
Esempio:
La classe Dog aggiunge un nuovo metodo fetch() che non esiste nella classe base Animal.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
fetch() {
console.log(`${this.name} is fetching.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
dog.fetch(); // "Rex is fetching."
7.5 Controllo dell'ereditarietà
Per verificare l'ereditarietà si può usare l'operatore instanceof e il metodo isPrototypeOf().
Esempio:
L'operatore instanceof verifica se un oggetto è un'istanza di una classe. Il metodo isPrototypeOf() verifica se il prototipo di un oggetto è parte della catena dei prototipi di un altro oggetto.
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(Animal.prototype.isPrototypeOf(Dog.prototype)); // true
GO TO FULL VERSION