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
Animal
ist die Basisklasse mit einem Konstruktor und der Methodespeak()
- Die Klasse
Dog
erbt vonAnimal
und überschreibt die Methodespeak()
- Die Instanz
dog
der KlasseDog
nutzt 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