Konstruktor

S pevnými počátečními hodnotami začíná každá nová příšera jako skřet s 30 životy a vlastnosti jí musíte měnit až po new. Praktičtější je říct hned, co chcete: new Prisera("Vlk", 25). K tomu slouží konstruktor:

class Prisera {
    jmeno: string;
    zivoty: number;

    constructor(jmeno: string, zivoty: number) {
        this.jmeno = jmeno;
        this.zivoty = zivoty;
    }
}

const vlk = new Prisera("Vlk", 25);
const troll = new Prisera("Troll", 80);
console.log(vlk);
console.log(troll);

Vypíše:

Prisera { jmeno: "Vlk", zivoty: 25 }
Prisera { jmeno: "Troll", zivoty: 80 }

Konstruktor je zvláštní funkce uvnitř třídy, která se jmenuje constructor. Sami ji nikdy nevoláte: zavolá ji new pokaždé, když vytváří objekt, a argumenty z new Prisera("Vlk", 25) se dosadí do jejích parametrů. Parametry mají typy jako u každé funkce, takže TypeScript kontroluje i argumenty new: new Prisera("Vlk") skončí chybou Expected 2 arguments, but got 1. (TS2554) a new Prisera(25, "Vlk") chybou TS2345.

Co je this? Uvnitř konstruktoru je this ten nový objekt, který právě vzniká. this.jmeno = jmeno; znamená: „Vlastnosti jmeno nového objektu nastav hodnotu parametru jmeno.“ Obě strany se jmenují stejně, což je obvyklé, ale jde o dvě různé věci: this.jmeno je vlastnost objektu, samotné jmeno je parametr.

new Prisera("Vlk", 25) tedy udělá tohle:

  1. Vytvoří nový, prázdný objekt třídy Prisera.
  2. Nastaví vlastnosti, které mají počáteční hodnotu.
  3. Spustí konstruktor, ve kterém je this ten nový objekt, a konstruktor doplní zbytek.
  4. Vrátí vám hotový objekt.

Vlastnosti jmeno a zivoty teď počáteční hodnoty nemají, a to je v pořádku: TypeScript zkontroluje, že každé z nich dá hodnotu konstruktor. Vlastnost může mít i počáteční hodnotu a v konstruktoru se vůbec neobjevit, třeba uroven: number = 1;.

Typická chyba je zapomenuté this: řádek jmeno = jmeno; jen přiřadí parametr sám sobě a vlastnost zůstane prázdná. TypeScript si toho všimne:

class Prisera {
    jmeno: string;
    zivoty: number;

    constructor(jmeno: string, zivoty: number) {
        jmeno = jmeno;
        this.zivoty = zivoty;
    }
}

TypeScript ohlásí:

main.ts(2,5): error TS2564: Property 'jmeno' has no initializer and is not definitely assigned in the constructor.

Poznámka do budoucna. V cizím kódu v TypeScriptu narazíte na kratší zápis: constructor(public jmeno: string) {} vlastnost deklaruje a rovnou nastaví. Říká se mu parametrická vlastnost (anglicky parameter property) a tady na webu není dovolený: dostali byste chybu This syntax is not allowed when 'erasableSyntaxOnly' is enabled. (TS1294), stejnou jako u enum v lekci 5. Parametrická vlastnost totiž není jen JavaScript s typy: TypeScript pro ni musí vygenerovat kód navíc, a to nástroje, které typy jen odstraní, neumějí. Pište proto vlastnosti a this.jmeno = jmeno; jako výše.

Pokyny

Dejte třídě Hrdina konstruktor se dvěma parametry, jmeno: string a povolani: Povolani, který nastaví vlastnosti jmeno a povolani. Těmto dvěma vlastnostem odstraňte počáteční hodnoty (uroven si svou 1 nechá). TypeScript pak ohlásí řádky s new Hrdina(): doplňte jim argumenty, new Hrdina("Kira", "hranicar") a new Hrdina("Bruno", "valecnik"), a smažte dva řádky, které Bruna dodatečně měnily. Program vypíše totéž co předtím.

K družině se přidá Lena, která je mág. Vytvořte lena pomocí konstruktoru a vypište ji s použitím jejích vlastností takto:

Lena (mag), úroveň 1

Povolání se vypíše tak, jak je napsané v kódu, tedy mag bez čárky.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

2/9