7.1 Grundlagen der Vererbung
Die Vererbung von Klassen in JavaScript ermöglicht es, neue Klassen auf Grundlage bereits existierender zu erstellen, deren Funktionalität wiederzuverwenden und zu erweitern. Das ist ein essenzieller Aspekt der objektorientierten Programmierung (OOP), mit dem man Klassenhierarchien schaffen und das Verhalten von Objekten steuern kann.
Für die Vererbung von Klassen wird das Schlüsselwort extends verwendet. Eine Klasse, die eine andere Klasse erbt, wird als abgeleitete Klasse (subclass) bezeichnet, und die Klasse, von der geerbt wird, als Basisklasse (superclass).
Beispiel:
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."
Erklärung:
- Die Klasse
Animalist die Basisklasse mit einem Konstruktor und der Methodespeak() - Die Klasse
Dogerbt vonAnimalund überschreibt die Methodespeak() - Die Instanz
dogder KlasseDognutzt die überschriebene Methodespeak()
7.2 Das Schlüsselwort super
Das Schlüsselwort super wird verwendet, um den Konstruktor oder Methoden der Basisklasse aus der abgeleiteten Klasse aufzurufen.
1. Aufruf des Konstruktors der Basisklasse
Die abgeleitete Klasse muss den Konstruktor der Basisklasse mit super() aufrufen, bevor this verwendet wird.
Beispiel:
Der Konstruktor Dog ruft super(name) auf, um die Eigenschaft name der Basisklasse Animal zu initialisieren.
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. Aufruf von Methoden der Basisklasse
Methoden der Basisklasse können aus der abgeleiteten Klasse mit super aufgerufen werden.
Beispiel:
Die Methode speak() der Klasse Dog ruft die Methode speak() der Basisklasse Animal mit super.speak() auf, bevor sie ihre eigene Logik ausführt.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
super.speak(); // Aufruf der Methode der Basisklasse
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak();
// "Rex makes a noise."
// "Rex barks."
7.3 Vererbung und Überschreiben von Methoden
Die Vererbung ermöglicht es den abgeleiteten Klassen, Methoden der Basisklasse zu überschreiben. Das bietet die Möglichkeit, die Funktionalität von Methoden zu verändern oder zu erweitern.
Beispiel:
Die Methode speak() der Klasse Dog überschreibt die Methode speak() der Basisklasse Animal und bietet eine eigene Implementierung.
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 Vererbung und zusätzliche Methoden
Die abgeleitete Klasse kann neue Methoden hinzufügen, die in der Basisklasse nicht existieren.
Beispiel:
Die Klasse Dog fügt eine neue Methode fetch() hinzu, die in der Basisklasse Animal nicht existiert.
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 Überprüfung der Vererbung
Zur Überprüfung der Vererbung kann der Operator instanceof und die Methode isPrototypeOf() verwendet werden.
Beispiel:
Der Operator instanceof überprüft, ob ein Objekt eine Instanz einer Klasse ist. Die Methode isPrototypeOf() überprüft, ob das Prototypenobjekt Teil der Prototypenkette eines anderen Objekts ist.
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(Animal.prototype.isPrototypeOf(Dog.prototype)); // true
GO TO FULL VERSION