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.

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
50

Př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/50

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

3/9