private a public
Každý kód může změnit kteroukoli vlastnost objektu. Stačí jeden neopatrný řádek kdekoli ve hře a Kira má záporné zlato:
class Hrdina {
jmeno: string;
zlato: number = 0;
constructor(jmeno: string) {
this.jmeno = jmeno;
}
vydelej(castka: number): void {
this.zlato = this.zlato + castka;
}
}
const kira = new Hrdina("Kira");
kira.vydelej(50);
kira.zlato = kira.zlato - 80; // koupí meč za 80 zlatých
console.log(`${kira.jmeno} má ${kira.zlato} zlatých`);Vypíše:
Kira má -30 zlatýchTřída by si své zlato měla hlídat sama: měnit ho smějí jen její vlastní metody, a ty můžou kontrolovat pravidla. Označte vlastnost jako private:
class Hrdina {
jmeno: string;
private zlato: number = 0;
constructor(jmeno: string) {
this.jmeno = jmeno;
}
vydelej(castka: number): void {
this.zlato = this.zlato + castka;
}
utrat(castka: number): boolean {
if (castka > this.zlato) {
return false;
}
this.zlato = this.zlato - castka;
return true;
}
zjistiZlato(): number {
return this.zlato;
}
}
const kira = new Hrdina("Kira");
kira.vydelej(50);
console.log(kira.utrat(80));
console.log(kira.utrat(30));
console.log(`${kira.jmeno} má ${kira.zjistiZlato()} zlatých`);Vypíše:
false
true
Kira má 20 zlatýchSoukromou vlastnost (private) můžete používat jen uvnitř třídy, v jejích metodách, přes this. Kód mimo třídu ji nesmí číst ani měnit. Přidejte na konec programu kira.zlato = 1000; a TypeScript ohlásí:
main.ts(31,6): error TS2341: Property 'zlato' is private and only accessible within class 'Hrdina'.Zbytek hry se ke zlatu dostane přes metody a ty dodržují pravidla: utrat vrátí false a nic nezmění, když zlato nestačí, a zjistiZlato dovolí zlato přečíst, ale ne změnit. Vlastnosti a metody bez private jsou veřejné (public): smí je použít kdokoli. To platí automaticky. Můžete to napsat i výslovně (public jmeno: string;), většina kódu to ale nedělá.
Stejně jako readonly v lekci 4 kontroluje private jen TypeScript. V JavaScriptu je zlato obyčejná vlastnost a console.log(kira) ji pořád ukáže: Hrdina { jmeno: "Kira", zlato: 20 }. JavaScript má i vlastní soukromé vlastnosti, jejichž názvy začínají znakem # (#zlato); ty zůstanou skryté i za běhu programu. V cizím kódu potkáte oba druhy.
Typické chyby: čtení soukromé vlastnosti mimo třídu (přidejte metodu, která ji vrátí, jako zjistiZlato) a soukromá metoda, kterou zbytek programu potřebuje volat.
Jak psát:
Pokyny
Spusťte program: Lena skončí se zápornou manou. Přidejte metodu sesli(cena: number): boolean: když má mág méně many, než je cena, vrátí false a nic nezmění; jinak od mana odečte cena a vrátí true. Oba řádky, které mění lena.mana, nahraďte příkazem console.log(lena.sesli(15));. Program vypíše:
true
false
Lena má 5 manyAby nikdo nemohl sesli obejít, označte vlastnost mana jako private. TypeScript pak ohlásí poslední řádek, který čte lena.mana zvenku. Přidejte metodu zjistiManu(): number a na tom řádku ji použijte. Program vypíše totéž co předtím.
Začněte programovat zdarma
4/9