IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

3. diel - Vlastnosti objektov a konštruktory v JavaScripte

V minulej lekcii, Prvý objektová aplikácie v JavaScripte , sme si napísali svoju prvú objektovú aplikáciu. Už vieme definovať triedy a ich metódy reprezentujúci akcie, ktoré môžu vykonávať. Novú inštanciu vieme následne z triedy vytvoriť pomocou kľúčového slova new. Tiež vieme, že na triedach môžeme definovať vlastnosti, čo sme ešte neskúšali. Práve vlastnostiam objektov sa budeme v dnešnom tutoriálu objektovo orientovaného programovania v JavaScripte venovať.

Vlastnosti

Vytvorme si nový ukážkový program, tentoraz budeme reprezentovať firmy.

Zamyslime sa, čo by naša firma mala obsahovať za vlastnosti. Môžeme jej priradiť názov, sídlo a zoznam zamestnancov. Vytvoríme súbor Firma.js a zatiaľ ho ponecháme ako prázdnu triedu:

class Firma {

}

S triedami budeme opäť pracovať v nejakom ďalšom súboru, môže sa volať zas obsluha.js. Tu si môžeme vytvoriť novú inštanciu našej firmy:

const microsoft = new Firma();

Nezabudnite si súbor Firma.js načítať v index.html. Ďalšie spôsoby importovania súborov si ukážeme ďalej v kurze.

Vlastnosti triedy sú de facto premenné, ktoré budú mať na sebe inštancie danej triedy. Môžeme k nim pristupovať z metód vnútri triedy, bez toho aby sme ich museli odovzdať ako parameter. A možno k nim pristupovať aj zvonku, na konkrétne vytvorené inštanciu.

Definujme našej inštanciu microsoft vlastnosť nazev. K vlastnostiam inštancií pristupujeme cez bodku ., Čo značí, že to čo budeme písať patrí našej inštanciu. Ďalej uvedieme názov našej vlastnosti. Zápis môže vyzerať takto:

microsoft.nazev = "Microsoft Corporation";

Pridajme si tento riadok do obsluha.js a skúsme si našej vlastnosť vypísať na stránku. Teraz by kompletné obsluha.js mohla vyzerať takto:

const microsoft = new Firma();
microsoft.nazev = "Microsoft Corporation"; // Přidáme naší firmě vlastnost název s nějakou hodnotou
document.write(microsoft.nazev); // Vypíšeme název na stránku

Teraz si stránku skúsme otvoriť v prehliadači:

Tvoja stránka
localhost

Ako vidíme, vlastnosť našej inštancie sa vypísala. Takto by sme mohli pokračovať a vytvoriť viac inštancií firiem s rôznymi názvami:

const microsoft = new Firma();
microsoft.nazev = "Microsoft Corporation";
const google = new Firma();
google.nazev = "Google LLC";
document.write(microsoft.nazev); // Vypíšeme názvy firem
document.write('<br />');
document.write(google.nazev);

výsledok:

Tvoja stránka
localhost

Konštruktor

Pretože je naša trieda prázdna, museli by sme vlastnosť nazev takto pridať i pre ďalšie budúce inštancie triedy Firma, aby ju mali všetky. Keď vynecháme fakt, že je to veľa opakujúceho sa kódu, ak by bolo vlastností alebo inštancií viac, mohli by sme na nejakú zabudnúť. To nie je práve praktické. Preto môžeme pre vytvorenie vlastnosti nejaké inštancie použiť špeciálnu metódu priamo v triede, tzv. Konštruktor.

Konštruktor je metóda, ktorá sa automaticky zavolá pri vytváraní novej inštancie triedy. Slúži samozrejme k nastavenie vnútorného stavu objektu a na vykonanie prípadnej inicializácia. Práve v nej môžeme vlastnosti novým inštanciám jednoducho vytvoriť. Skúsime si to na ukážke si firmou.

Konštruktor firmy

V triede budeme potrebovať pristúpiť k jej aktuálnu inštanciu, ktorá sa práve vytvára, a príslušné vlastnosti ju nastaviť. K aktuálnej inštanciu v triede pristúpime pomocou kľúčového slova this, ktoré sa v JavaScripte bohužiaľ chová rôzne, v závislosti od kontextu. K tejto problematike sa v kurze ešte niekoľkokrát vrátime.

Do triedy v súbore Firma.js teda pridajme konštruktor, metódu spúšťajúci sa pri vytváraní nových inštancií, a v nej nastavme pomocou this aktuálne inštanciu všetky vlastnosti firmy, o ktorých sme hovorili v úvode. Konštruktor sa v JavaScripte vždy volá constructor():

class Firma {

    constructor() {
        this.nazev = "Název firmy";
        this.sidlo = "Praha";
        this.zamestnanci = [];
    }
}

Názov a sídlo je jasné, ukladáme je v dvoch vlastnostiach ako textový reťazec. Všetky firmy budú mať teraz názov "Název firmy" a sídlo "Praha". Zamestnanca firmy budeme ukladať do poľa, pri vytvorení inštancie ju teda rovno aj pripravíme prázdne pole.

Z obsluha.js teraz odoberieme riadky pridávajúce jednotlivým firmám vlastnosti:

const microsoft = new Firma();
const google = new Firma();
document.write(microsoft.nazev); // Vypíšeme názvy firem
document.write('<br />');
document.write(google.nazev);

Každé zavolanie new Firma() zavolá automaticky konštruktor. Keď skript spustíme, dostaneme podobný výpis ako minule:

Tvoja stránka
localhost

Parametre konstruktoru

Samozrejme ale nechceme mať u všetkých firiem vo vlastnostiach rovnaké hodnoty. Preto názov a sídlo odovzdáme konštruktory firmy parametrom. Upravíme teda Firma.js:

class Firma {

    constructor(nazev, sidlo) {
        this.nazev = nazev;
        this.sidlo = sidlo;
        this.zamestnanci = [];
    }

}

Parametre vyplníme pri vytváraní inštancií našej triedy v obsluha.js:

const microsoft = new Firma("Microsoft Corporation", "Redmont, Washington");
const google = new Firma("Google LLC", "Mountain View, California");
document.write(microsoft.nazev); // Vypíšeme názvy firem
document.write('<br />');
document.write(google.nazev);

Teraz už vieme, na čo slúži ony zátvorky za názvom triedy pri vytváraní jej inštancie :) Pri spustení skriptu už získame rovnaký výpis:

Tvoja stránka
localhost

Parametre takto samozrejme môžeme odovzdať akejkoľvek metóde, ako sme to v minulosti robili u funkcií.

Metódy

V rámci tréningu firme pridajme okrem konstruktoru ešte niekoľko klasických metód.

Výpis názvu a sídla

Vytvoríme metódu na napísanie mena našej firmy a jej sídla. Vyskúšame si tak, že k vlastnostiam inštancie môžeme v triede jednoducho pristupovať. Vypisovací metóda v triede Firma, v súbore Firma.js, môže vyzerať napr. Nasledovne:

vypisInfoOFirme() {
    document.write("Firma " + this.nazev + " sídlí v " + this.sidlo);
}

Keď by sme ju zavolali v obsluha.js, takto:

const microsoft = new Firma("Microsoft Corporation", "Redmont, Washington");
microsoft.vypisInfoOFirme(); // Vypíšeme na stránku

Tak by naša stránka mala vyzerať takto:

Tvoja stránka
localhost

Vyzerá to, že všetko funguje veľmi dobre :)

Avšak vráťme sa na chvíľku k našej metóde. Náš spôsob zostavenia textu je trochu nešťastný. Musíme vždy ukončiť textový reťazec a potom pripojiť ďalšie. To môže byť zdrojom chýb a zápis ide samozrejme zjednodušiť. Do textového reťazca môžeme priamo vkladať nejaké hodnoty, bez toho aby sme ho museli akokoľvek ukončovať. Stačí pre zápis reťazca použiť spätné úvodzovky `. Do reťazca potom jednotlivé ukazovatele vkladáme pomocou dolára a zložených zátvoriek ako ${nazevPromenne}.

Elegantnejší verzia našej metódy by mohla vyzerať takto:

vypisInfoOFirme() {
    document.write(`Firma ${this.nazev} sídlí v ${this.sidlo}`);
}

Keď skript spustíme, uvidíme opäť rovnaký výpis. Tento zápis je však oveľa jednoduchšie a prehľadnejšie.

Výpis zamestnancov

Ďalej do triedy pridáme metódy na vytváranie zamestnancov a na ich výpis.

Keďže budeme pracovať so zamestnancami, vytvoríme si pre nich novú triedu v súbore Zamestnanec.js, rovno aj s konštruktor:

class Zamestnanec {

    constructor(jmeno, vek, pozice) {
        this.jmeno = jmeno;
        this.vek = vek;
        this.pozice = pozice;
    }

}

Súbor s triedou si nezabudnite opäť naimportovať v index.html:

<script src="js/Zamestnanec.js"></script>

Vytváranie zamestnancov

Pre vytváranie zamestnancov si získame vstup od užívateľa. Keďže s objektmi začíname, vyhneme sa zatiaľ užívateľskému rozhraniu a pre získanie vstupov použijeme funkciu prompt(). Nová metóda triedy Firma bude vyzerať takto:

pridejZamestnance() {
    const jmeno = prompt("Zadej jméno zaměstnance");
    const vek = prompt("Zadej věk");
    const pozice = prompt("Zadej pracovní pozici");
    const zamestnanec = new Zamestnanec(jmeno, vek, pozice);
    this.zamestnanci.push(zamestnanec); // Přidáme nového zaměstnance do pole
}

Na prvých troch riadkoch od užívateľa načítame meno, vek a pracovnú pozíciu nového zamestnanca. Toho ďalej vytvoríme a uložíme ho do premennej zamestnanec. Do poľa ho pridáme pomocou metódy push(). V obsluha.js našu novú metódu zavoláme:

const microsoft = new Firma("Microsoft Corporation", "Redmont, Washington");
microsoft.vypisInfoOFirme();
microsoft.pridejZamestnance();

Noví zamestnanci sa zatiaľ nikam nevypisujú, poďme to napraviť.

Výpis zamestnancov

Do Firma.js pridáme posledné metódu vypisZamestnance(), ktorá do stránky vypíše HTML zoznam našich zamestnancov. Mohla by vyzerať napr. Nasledovne:

vypisZamestnance() {
    document.write("<h3>Zaměstnanci</h3>");
    const seznam = document.createElement("ul"); // Vytvoříme seznam jako HTML element
    for (const zamestnanec of this.zamestnanci) { // Naplníme jej daty
        seznam.innerHTML += `<li><strong>Jméno</strong>: ${zamestnanec.jmeno}</li>`;
        seznam.innerHTML += `<li><strong>Věk</strong>: ${zamestnanec.vek}</li>`;
        seznam.innerHTML += `<li><strong>Pozice</strong>: ${zamestnanec.pozice}</li><br>`;
    }
    document.body.appendChild(seznam); // Přiřadíme element do body
}

Vytvárame si konštantu seznam, do ktorej vytvárame nový element typu <ul>, teda nečíslovaný zoznam. Následne proiterujeme naše pole zamestnancov foreach cyklom a vlastnosti každého zamestnanca pridáme ako odrážky zoznamu. Nakoniec náš zoznam vložíme do <body>.

Teraz metódu stačí už len zavolať v obsluha.js. Možno ešte môžeme zavolať raz metódu na vytvorenie ďalšieho zamestnanca, aby sme videli, ako bude náš zoznam vyzerať s viacerými zamestnancami:

const microsoft = new Firma("Microsoft Corporation", "Redmont, Washington");
microsoft.vypisInfoOFirme();
microsoft.pridejZamestnance();
microsoft.pridejZamestnance();
microsoft.vypisZamestnance();

Keď spustíme a vyplníme, naša stránka by mohla vyzerať takto:

Tvoja stránka
localhost

To by pre dnešok bolo všetko. Ak vám čokoľvek nefunguje, dole máte k dispozícii odkaz na stiahnutie kompletného projektu, aby ste si mohli nájsť chybu. :) V budúcej lekcii, Kvíz - Úvod a vlastnosti objektov v JavaScripte , si povieme niečo o odlišnostiach medzi referenčnými dátovými typmi (objekty) a typy hodnotovými (napr. number).

V nasledujúcom kvíze, Kvíz - Úvod a vlastnosti objektov v JavaScripte, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 589x (3.44 kB)
Aplikácia je vrátane zdrojových kódov v jazyku JavaScript

 

Predchádzajúci článok
Prvý objektová aplikácie v JavaScripte
Všetky články v sekcii
Objektovo orientované programovanie v JavaScriptu
Preskočiť článok
(neodporúčame)
Kvíz - Úvod a vlastnosti objektov v JavaScripte
Článok pre vás napísal Šimon Raichl
Avatar
Užívateľské hodnotenie:
2 hlasov
Autor se věnuje hlavně tvorbě všemožných věcí v JS
Aktivity