🌐 Lehrpfad 2: Moderne Datenmodelle & OOP

JS 06: Klassen & Objektorientierung (OOP)

Lerne professionelle Datenmodellierung mit ES6-Klassen, Kapselung, Vererbung und statischen Fabrikmethoden.

🏗️ 1. Der Klassen-Bauplan: class, constructor & this

Mit ECMAScript 2015 (ES6) führte JavaScript eine elegante, standardisierte Klassensyntax ein. Eine Klasse ist wie ein technischer Bauplan, aus dem mit dem Schlüsselwort new beliebig viele konkrete Objekte (Instanzen) gefertigt werden:

class Benutzer {
  // Der Konstruktor wird beim Erzeugen mit 'new' aufgerufen:
  constructor(name, email) {
    this.name = name;     // Instanzvariable zuweisen
    this.email = email;
    this.erstelltAm = new Date();
  }

  // Methoden werden direkt im Klassenkörper definiert (ohne 'function'):
  begruessen() {
    return `Hallo, mein Name ist ${this.name}!`;
  }
}

// Instanziierung:
const user1 = new Benutzer("Anna Schmidt", "anna@dev.io");
console.log(user1.begruessen()); // "Hallo, mein Name ist Anna Schmidt!"

🔒 2. Kapselung: Getters, Setters & Datenvalidierung

Objektorientierte Kapselung schützt interne Zustände vor unkontrollierten Änderungen von außen. Mit get und set steuerst du Lese- und Schreibzugriffe und validierst eingehende Werte:

class Bankkonto {
  constructor(inhaber, startSaldo = 0) {
    this.inhaber = inhaber;
    this._saldo = startSaldo; // Konvention: Unterstrich signalisiert internen Zustand
  }

  // Getter: Zugriff wie auf eine normale Eigenschaft (konto.saldo)
  get saldo() {
    return this._saldo;
  }

  // Kontrollierte Methoden statt direktem Schreibzugriff:
  einzahlen(betrag) {
    if (betrag <= 0) {
      throw new Error("Einzahlungsbetrag muss positiv sein.");
    }
    this._saldo += betrag;
    return this._saldo;
  }
}
🏭 Didaktische Analogie: Der Bauplan & die Fabrikstraße

Stelle dir eine Klasse wie den CAD-Konstruktionsplan eines Autos in einer Autofabrik vor. Jedes Mal, wenn du new Auto(...) ausführst, rollt ein eigenständiges Fahrzeug vom Fließband auf die Straße (die Instanz). Das Auto besitzt eigene Farben und Seriennummern (Instanzvariablen), bedient sich über Pedale und Lenkrad (Methoden), und die Maschinen in der Fabrikhalle selbst sind die statischen Werkzeuge.

🧬 3. Vererbung mit extends & Elternaufruf super()

Klassen können Eigenschaften und Methoden von Basisklassen erben. Mit extends leitet man eine Kindklasse ab und mit super(...) ruft man den Konstruktor oder die Methoden der Elternklasse auf:

// Basisklasse:
class Fahrzeug {
  constructor(marke, modell, baujahr) {
    this.marke = marke;
    this.modell = modell;
    this.baujahr = baujahr;
  }

  beschreibung() {
    return `${this.marke} ${this.modell} (${this.baujahr})`;
  }
}

// Kindklasse erbt von Fahrzeug:
class ElektroAuto extends Fahrzeug {
  constructor(marke, modell, baujahr, batterieKapazitaet) {
    super(marke, modell, baujahr); // 1. Pflicht: Eltern-Konstruktor aufrufen!
    this.batterieKapazitaet = batterieKapazitaet; // 2. Eigene Eigenschaften setzen
  }

  // Methode der Elternklasse überschreiben & erweitern:
  beschreibung() {
    return `${super.beschreibung()} [Elektro: ${this.batterieKapazitaet} kWh]`;
  }

  reichweiteBerechnen(verbrauchPro100km) {
    return (this.batterieKapazitaet / verbrauchPro100km) * 100;
  }
}

📊 Klassenhierarchie (UML-Diagramm)

Fahrzeug (Basis)
Attribute
+ marke: string
+ modell: string
+ baujahr: number
Methoden
+ beschreibung(): string
← extends
ElektroAuto (Kind)
Zusatz-Attribute
+ batterieKapazitaet: number
Zusatz-Methoden
+ beschreibung(): string (override)
+ reichweiteBerechnen(v): number
+ static erstelleStandardTesla()

⚙️ 4. Statische Methoden & Fabrikfunktionen (static)

Statische Methoden gehören zur Klasse selbst und nicht zu einer einzelnen Instanz. Man ruft sie direkt über KlassenName.methode() auf. Sie eignen sich hervorragend für Hilfsfunktionen und Fabrikmuster (Factory Methods):

class ElektroAuto extends Fahrzeug {
  // ... Konstruktor und Methoden ...

  // Statische Fabrikmethode erzeugt vorkonfigurierte Instanzen:
  static erstelleStandardTesla() {
    return new ElektroAuto("Tesla", "Model 3", 2024, 75);
  }
}

// Aufruf direkt an der Klasse, ohne vorheriges 'new':
const meinTesla = ElektroAuto.erstelleStandardTesla();
console.log(meinTesla.beschreibung());
// "Tesla Model 3 (2024) [Elektro: 75 kWh]"

📑 5. Cheat-Sheet: JavaScript OOP & ES6 Klassen

Konzept Syntax-Beispiel Bedeutung
Klassendeklaration class Auto { ... } Definiert einen neuen Objekttypen-Bauplan
Konstruktor constructor(farbe) { this.farbe = farbe; } Initialisiert neue Objekt-Instanzen
Getter / Setter get saldo() { return this._saldo; } Kontrollierter Lese- und Schreibzugriff
Vererbung class Kind extends Basis { ... } Übernimmt Attribute & Methoden der Elternklasse
Super-Aufruf super(arg1, arg2); Führt den Eltern-Konstruktor oder Eltern-Methoden aus
Statische Methode static erzeuge() { return new X(); } Klassenbezogene Hilfs- oder Fabrikmethode
Typ-Prüfung obj instanceof Klasse Prüft, ob obj aus Klasse oder deren Vererbungslinie stammt

🧠 Diagnostischer Selbst-Check

Überprüfe dein Verständnis der Kernkonzepte und typischen Denkfallen, bevor du den Code in der Web-IDE schreibst.

🎯 6. Aufgaben & Checkliste in aufgabe.js

💡 Tipp für Teilziel 3 & 4

Vergiss nicht, in der Kindklasse ElektroAuto als allererste Anweisung im Konstruktor super(marke, modell, baujahr) aufzurufen, bevor du auf this.batterieKapazitaet zugreifst!

💻 In Web-IDE öffnen → ← Zurück zu JS 03 Weiter zu JS 07 →