JavaScript/Tutorials/OOP/Klassen und Vererbung

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Wir haben bisher ursprüngliches JavaScript gesehen. Man hat bei der Gestaltung der Sprache viel Wert darauf gelegt, dass Dinge sehr dynamisch sind. Deswegen fühlte sich das Erzeugen von Objekten in JavaScript nicht so an, wie es das in anderen Sprachen mit einem typischen Klassenkonzept tut. Seit dem Spachstandard ECMA 6 gibt es jedoch die Möglichkeit, eine Schreibweise zu verwenden, die in anderen Sprachen sehr ähnlich funktioniert.

Klassen[Bearbeiten]

Wir haben schon gelernt, wie man mit Konstruktorfunktionen Objekte erzeugen kann. Dabei können verschiedene Konstruktorfunktionen verschiedene Objekttypen erzeugen. Eine Klasse ist nun eine etwas ausgefeiltere Art, einen Bauplan für ein Objekt zu erstellen. Außerdem leistet sie noch mehr, aber dazu mehr im Bereich Vererbung.

Person-Objekt mit einer Klasse
class Person {

  constructor (n, a) {
    this.name = n;
    this.alter = a;
  }

  vorstellen () {
    return "Ich heiße " + this.name + " und bin " + this.alter + " Jahre alt.";
  }
}

const o = new Person("Frizzy", 15);

o.vorstellen(); // Ich heiße Frizzy und bin 15 Jahre alt.

const p = new Person("Ozzy", 39);

p.vorstellen(); // Ich heiße Ozzy und bin 39 Jahre alt.
Wir schreiben im Grunde nichts neues, sondern verwenden die identische Objektstruktur unseres Beispiels aus dem letzten Kapitel. Nur die Schreibweise ist etwas anders. Wir finden jedoch unsere Konstruktorfunktion wieder, hier unter dem festgelegten Namen constructor. Anders als bei unserem Beispiel im letzten Kapitel wird hier die Methode vorstellen nicht innerhalb der Konstruktorfunktion als Funktionsliteral notiert (was durchaus auch möglich wäre), sondern wird ganz klar als Methode neben dem Konstruktor aufgeführt. Das erhöht die Lesbarkeit und macht den Code übersichtlicher.

Vererbung[Bearbeiten]

Man kann Klassen zueinander in Beziehung setzen, indem man das Modell der Vererbung anwendet: Eine Klasse vom Typ B kann die Objektstruktur einer Klasse vom Typ A erben und für sich erweitern. Damit bauen Objekte vom Typ B auf der Objektstruktur von Typ A auf.

Klassenmodell mit Vererbung
class Person {

  constructor (n, a) {
    this.name = n;
    this.alter = a;
  }

  vorstellen () {
    return "Ich heiße " + this.name + " und bin " + this.alter + " Jahre alt.";
  }
}

class Schueler extends Person {
  tuWas () {
    return "keine Lust";
  }
}

class Lehrkraft extends Person {
  tuWas () {
    return "korrigiere Tests";
  }
}

const o = new Schueler("Frizzy", 15);

o.vorstellen(); // Ich heiße Frizzy und bin 15 Jahre alt.
o.tuWas(); // keine Lust

const p = new Lehrkraft("Frau Streng", 39);

p.vorstellen(); // Ich heiße Frau Streng und bin 39 Jahre alt.
p.tuWas(); // korrigiere Tests
In diesem Beispiel werden drei Klassen definiert, wobei die erste Klasse (Person) für die beiden folgenden Klassen eine Basis bildet, von der sie erben werden.
Die Klassen Schueler und Lehrkraft übernehmen („erben”) die Objektstruktur von Person mithilfe des Schlüsselwortes extends (englisch für erweitert). Das ist der Grund, warum die Methode vorstellen in den Klassen Schueler und Lehrkraft ebenso verfügbar ist. Zusätzlich fügen beide jeweils noch eine eigene Methode hinzu, die hier in beiden Fällen tuWas lautet, jedoch unterschiedliche Funktionalität hat.