Methoden und this
Objekte halten meist nicht nur Daten; sie tun auch etwas. Ein Held erleidet Schaden, heilt sich, beschreibt sich selbst. Funktionen, die zu einer Klasse gehören, sind ihre Methoden. (Im JavaScript-Kurs wurde erwähnt, dass eine Funktion, die in einem Objekt gespeichert ist, Methode heißt, wie log in console.log.) In einer Klasse schreibst du eine Methode wie eine Funktion, nur ohne das Wort function:
class Held {
name: string;
leben: number = 50;
constructor(name: string) {
this.name = name;
}
nimmSchaden(menge: number): void {
this.leben = this.leben - menge;
}
beschreibe(): string {
return `${this.name}: ${this.leben} Leben`;
}
}
const kira = new Held("Kira");
const bruno = new Held("Bruno");
kira.nimmSchaden(15);
bruno.nimmSchaden(5);
console.log(kira.beschreibe());
console.log(bruno.beschreibe());Das gibt aus:
Kira: 35 Leben
Bruno: 45 LebenEine Methode rufst du mit einem Punkt auf, wie du es gewohnt bist: kira.nimmSchaden(15). In der Methode ist this das Objekt, auf dem du sie aufgerufen hast. In kira.nimmSchaden(15) ist this gleich kira; in bruno.nimmSchaden(5) ist es bruno. So funktioniert eine Methode für jede Instanz: Jeder Aufruf ändert das Leben des Helden vor dem Punkt.
Methoden bekommen Typen wie Funktionen (Lektion 3): Typen für die Parameter und einen Rückgabetyp. Hier ist es void für nimmSchaden, das den Helden nur verändert, und string für beschreibe, das einen Text zurückgibt. TypeScript prüft Methodenaufrufe wie Funktionsaufrufe: kira.nimmSchaden("viel") ist TS2345, und kira.heile(5) ergibt Property 'heile' does not exist on type 'Held'. (TS2339), solange die Klasse keine solche Methode hat.
Methoden werden einmal in der Klasse gespeichert, und alle ihre Instanzen teilen sie. Deshalb zeigt console.log(kira) nur die Felder: Held { name: "Kira", leben: 35 }.
Typische Fehler: Der häufigste ist, this. in einer Methode zu vergessen. Ein Feld ist keine Variable; du erreichst es über das Objekt. TypeScript schlägt sogar die Lösung vor:
class Held {
name: string;
leben: number = 50;
constructor(name: string) {
this.name = name;
}
nimmSchaden(menge: number): void {
leben = leben - menge;
}
}TypeScript meldet:
main.ts(10,9): error TS2663: Cannot find name 'leben'. Did you mean the instance member 'this.leben'?
main.ts(10,17): error TS2663: Cannot find name 'leben'. Did you mean the instance member 'this.leben'?Ein anderer ist, die Klammern zu vergessen. console.log(kira.beschreibe) ruft die Methode nicht auf; es gibt die Methode selbst aus, [Function: beschreibe]. TypeScript erlaubt das, denn auch eine Methode ist ein Wert.
So schreibst du es:
Anweisungen
- 1
Füge eine Methode
heile(menge: number): voidhinzu. Sie addiertmengezumlebendes Helden, aber nie übermaxLebenhinaus: Wäre die Summe größer, wirdlebenzumaxLeben. Heile Kira am Ende des Programms um10und gib ihrlebenaus, heile sie dann um50und gib es noch einmal aus. Das Programm gibt aus:20 30 50 - 2
Füge eine Methode
beschreibe(): stringhinzu, die Namen und Leben des Helden so zurückgibt:Kira: 50/50. Gibkira.beschreibe()aus. Erzeuge dann Bruno, lass ihn5Schaden erleiden und gib auch seine Beschreibung aus:Kira: 50/50 Bruno: 45/50