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
Dog
eredita daAnimal
e ridefinisce il metodospeak()
- L'istanza
dog
della classeDog
utilizza 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