Metody a this
Objekty obvykle nejen uchovávají data, ale také něco dělají. Hrdina přichází o životy, léčí se, popíše sám sebe. Funkcím, které patří ke třídě, se říká metody. (V kurzu JavaScriptu jste slyšeli, že funkce uložená v objektu je metoda, třeba log v console.log.) Ve třídě se metoda píše jako funkce, jen bez slova function:
class Hrdina {
jmeno: string;
zivoty: number = 50;
constructor(jmeno: string) {
this.jmeno = jmeno;
}
ztratZivoty(pocet: number): void {
this.zivoty = this.zivoty - pocet;
}
popis(): string {
return `${this.jmeno}: ${this.zivoty} životů`;
}
}
const kira = new Hrdina("Kira");
const bruno = new Hrdina("Bruno");
kira.ztratZivoty(15);
bruno.ztratZivoty(5);
console.log(kira.popis());
console.log(bruno.popis());Vypíše:
Kira: 35 životů
Bruno: 45 životůMetodu zavoláte s tečkou, jak jste zvyklí: kira.ztratZivoty(15). Uvnitř metody je this objekt, na kterém jste ji zavolali. Ve volání kira.ztratZivoty(15) je this objekt kira, ve volání bruno.ztratZivoty(5) objekt bruno. Díky tomu jedna metoda funguje pro všechny instance: každé volání změní životy toho hrdiny, který stojí před tečkou.
Metody mají typy stejně jako funkce (lekce 3): typy parametrů a návratový typ. Tady je to void u ztratZivoty, která hrdinu jen změní, a string u popis, která vrací text. Volání metod TypeScript kontroluje stejně jako volání funkcí: kira.ztratZivoty("hodně") je chyba TS2345 a kira.vylec(5) skončí chybou Property 'vylec' does not exist on type 'Hrdina'. (TS2339), dokud třída takovou metodu nemá.
Metody jsou uložené jednou, ve třídě, a všechny instance je sdílejí. Proto console.log(kira) ukáže jen vlastnosti: Hrdina { jmeno: "Kira", zivoty: 35 }.
Typická chyba je chybějící this. v metodě. Vlastnost není proměnná, dostanete se k ní jen přes objekt. TypeScript vám dokonce poradí, jak chybu opravit:
class Hrdina {
jmeno: string;
zivoty: number = 50;
constructor(jmeno: string) {
this.jmeno = jmeno;
}
ztratZivoty(pocet: number): void {
zivoty = zivoty - pocet;
}
}TypeScript ohlásí:
main.ts(10,9): error TS2663: Cannot find name 'zivoty'. Did you mean the instance member 'this.zivoty'?
main.ts(10,18): error TS2663: Cannot find name 'zivoty'. Did you mean the instance member 'this.zivoty'?Další častou chybou jsou zapomenuté závorky. console.log(kira.popis) metodu nezavolá, ale vypíše ji samotnou: [Function: popis]. TypeScript to dovolí, protože i metoda je hodnota.
Jak psát:
Pokyny
Přidejte metodu vylec(pocet: number): void. Ta hrdinovi přičte pocet k životům (zivoty), ale nikdy ne nad maxZivoty: kdyby byl součet větší, budou zivoty rovné maxZivoty. Na konci programu Kiru vylečte o 10 a vypište její životy, pak ji vylečte o 50 a vypište je znovu. Program vypíše:
20
30
50Přidejte metodu popis(): string, která vrátí jméno a životy hrdiny takto: Kira: 50/50. Vypište kira.popis(). Pak vytvořte Bruna, uberte mu 5 životů a vypište i jeho popis:
Kira: 50/50
Bruno: 45/50Začněte programovat zdarma
3/9