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:
- Vytvoří nový, prázdný objekt třídy
Prisera. - Nastaví vlastnosti, které mají počáteční hodnotu.
- Spustí konstruktor, ve kterém je
thisten nový objekt, a konstruktor doplní zbytek. - 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.
Jak psát:
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ň 1Povolání se vypíše tak, jak je napsané v kódu, tedy mag bez čárky.
Začněte programovat zdarma
2/9