Základy programovania

v JavaScripte

Milan Herda, 03/2020

Lekcia 6

Cvičenie

Naprogramujte funkciu, ktorá zistí, či je naľavo od Karla stena.

  • Ak tam je stena, tak vráti true
  • Ak tam nie je stena, tak vráti false

Pred a po spustení bude Karel otočený rovnako a jeho pozícia bude nezmenená.

function jeStenaVlavo() {
    otocDolava();
    
    const jeStena = jePredTebouStena();
    
    otocDoprava();
    
    return jeStena;
}

Cvičenie

Upravte funkciu tak, aby išlo o deklaráciu anonymnej funkcie uloženej do premennej.

const jeStenaVlavo = function () {
    otocDolava();
    
    const jeStena = jePredTebouStena();
    
    otocDoprava();
    
    return jeStena;
};

Cvičenie

Urobte funkciu akyJeDalsiSmerVlavo:

  • ako argument dostane smer, kam sa pozeráme
  • vráti smer, na ktorý budeme smerovať, ak sa z daného smeru otočíme doľava

Riešenie: Algoritmizácia

  • vymyslíme, ako budeme reprezentovať smer
  • vytvoríme funkciu s argumentom "terajsiSmer"
  • funkcia podľa terajšej hodnoty smeru vráti nový smer

Príklad:

Keď pozerám na sever, tak po otočení by som smeroval na západ. Vrátime západ

Riešenie: Reprezentácia smeru

Obyčajný string

'sever'
'juh'
'východ'
'západ'

Riešenie: Funkcia s jedným argumentom

const akyJeDalsiSmerVlavo = function (terajsiSmer) {
  
};

Riešenie: Ak sever, tak západ

const akyJeDalsiSmerVlavo = function (terajsiSmer) {
    if (terajsiSmer === 'sever') {
        return 'západ';
    }
};

Riešenie: Doplňte zvyšné vetvy

const akyJeDalsiSmerVlavo = function (terajsiSmer) {
    if (terajsiSmer === 'sever') {
        return 'západ';
    } else if (terajsiSmer === 'západ') {
        return 'juh';
    } else if (terajsiSmer === 'juh') {
        return 'východ';
    } else {
        return 'sever';
    }
};

Riešenie: Doplňte zvyšné vetvy

const akyJeDalsiSmerVlavo = function (terajsiSmer) {
    if (terajsiSmer === 'sever') {
        return 'západ';
    }
  
    if (terajsiSmer === 'západ') {
        return 'juh';
    }
  
    if (terajsiSmer === 'juh') {
        return 'východ';
    }

    return 'sever';
};

Riešenie: Vyskúšajte si

console.log(
  akyJeDalsiSmerVlavo('sever')
);

const dalsiSmer = akyJeDalsiSmerVlavo('juh');

console.log(dalsiSmer);
    

Koľkí ste sa urobili preklep v názve smeru?

"Programátori si zaslúžia istoty"

const SEVER  = 'sever';
const JUH    = 'juh';
const ZAPAD  = 'západ';
const VYCHOD = 'východ';

Zvolíme zodpovednejší spôsob reprezentácie smeru:

Riešenie:

const akyJeDalsiSmerVlavo = function (terajsiSmer) {
    if (terajsiSmer === SEVER) {
        return ZAPAD;
    }
  
    if (terajsiSmer === ZAPAD) {
        return JUH;
    }
  
    if (terajsiSmer === JUH) {
        return VYCHOD;
    }

    return SEVER;
};

Riešenie: Vyskúšajte si

console.log(
  akyJeDalsiSmerVlavo(SEVER)
);

const dalsiSmer = akyJeDalsiSmerVlavo(JUH);

console.log(dalsiSmer);
    
const akyJeDalsiSmerVpravo = function (terajsiSmer) {
    if (terajsiSmer === SEVER) {
        return VYCHOD;
    }
  
    if (terajsiSmer === VYCHOD) {
        return JUH;
    }
  
    if (terajsiSmer === JUH) {
        return ZAPAD;
    }

    return SEVER;
};

Úloha:

Naprogramujte funkciu akyJeDalsiSmerVpravo

Typy premenných

Primitívne typy

  • undefined (hodnota, ktorá nie je definovaná)
  • null (prázdna hodnota)
  • boolean (true alebo false)
  • číslo (celé číslo alebo desatinné)
  • reťazec

Zložené typy

  • objekt
  • pole
  • funkcia

Objekt

Typ premennej, v ktorá v sebe obsahuje skupinu primitívnych a/alebo zložených hodnôt.

Každej jednotlivej časti hovoríme "vlastnosť" alebo "property"

Každá vlastnosť má svoje meno a hodnotu.

const prazdnyObjekt = {};

const fero = {
    vek: 45,
    vyska: 183,
    adresa: {
        ulica: 'Farská 42',
        obec: 'Nitra',
    },
};

K vlastnostiam sa zvonka objektu pristupuje pomocou tzv. bodkovej notácie

const fero = {
    vek: 45,
    vyska: 183,
    adresa: {
        ulica: 'Farská 42',
        obec: 'Nitra'
    }
};
console.log(fero.vek);

fero.vek = 50;

console.log(fero.vek);

console.log(
    fero.adresa.obec
);

fero.vaha = 75;

Ako to, že je to const a môžeme meniť hodnoty?

Samotné const zakazuje iba urobiť nové priradenie do premennej.

const fero = {vek: 12};
fero = {vek: 45};

Nezakazuje meniť hodnotu vnútorných vlastností.

Okrem bodkovej notácie viete k prvkom pristúpiť aj pomocou hranatých zátvoriek [ a ]

console.log(fero['vek']);

fero['vek'] = 50;

console.log(fero['vek']);

console.log(
    fero['adresa']['obec']
);

fero['vaha'] = 75;
console.log(fero.vek);

fero.vek = 50;

console.log(fero.vek);

console.log(
    fero.adresa.obec
);

fero.vaha = 75;

Úloha

Vytvorte objekt, ktorý predstavuje mapu, kde Karel kreslí. Objekt bude mať dve vlastnosti reprezentujúce šírku a výšku

const mapa = {
    sirka: 20,
    vyska: 20,
};

Úloha

Vytvorte objekt, ktorý predstavuje Karla. Aké vlastnosti mu môžeme dať?

const karel = {
    riadok: 19,
    stlpec: 0,
    smer: 'sever',
};
const SEVER  = 'sever';
const JUH    = 'juh';
const VYCHOD = 'vychod';
const ZAPAD  = 'zapad';

const karel = {
    riadok: 19,
    stlpec: 0,
    smer: SEVER,
};

K čomu sú objekty dobré?

  • zoskupenie vlastností, ktoré k sebe patria
  • poriadok v premenných
    • čo predstavuje premenná vyska?
    • mapa.vyska?
    • obrazok.vyska?

Metódy

Do property objektu môže byť uložená rovnaká hodnota, ako aj do premennej.

Kedže do premennej vieme uložiť aj funkciu, ...

... tak aj do property vieme uložiť funkciu.

Funkcii, ktorá je vlastnosťou objektu, hovoríme metóda

Metódy

const obj = {
    nazovMetody: function () {
        // kod metody
    },
};

Cvičenie

Pridáme Karlovi metódu vpravoVbok, ktorá zmení hodnotu vlastnosti smer.

const karel = {
    riadok: 19,
    stlpec: 0,
    smer: SEVER,
     
    vpravoVbok: function () {

    },
};

Riešenie

const karel = {
    riadok: 19,
    stlpec: 0,
    smer: SEVER,
  
    vpravoVbok: function () {
        const dalsiSmer = akyJeDalsiSmerVpravo(karel.smer);
      
        karel.smer = dalsiSmer;
    },
};

Cvičenie: skráťte metódu

const karel = {
    riadok: 19,
    stlpec: 0,
    smer: SEVER,
  
    vpravoVbok: function () {
        karel.smer = akyJeDalsiSmerVpravo(karel.smer);
    },
};

Čo ak premenujem premennú karel?

Musím premenovať všetky jej výskyty vo všetkých metódach?

Fungovanie objektu by nemalo byť závislé na tom, ako sa volá premenná, v ktorej je objekt uložený.

Kľúčové slovo this

Vo vnútri každej funkcie je dostupná špeciálna premenná z názvom this

Ak je funkcia metódou, tak this obsahuje objekt, nad ktorým bola metóda zavolaná.

Použitie this:

const karel = {
    riadok: 19,
    stlpec: 0,
    smer: SEVER,
  
    vpravoVbok: function () {
        this.smer = akyJeDalsiSmerVpravo(this.smer);
    },
};

Cvičenie:

Urobte metódu vlavoVbok

const karel = {
    // doterajší kód

    vlavoVbok: function () {
        this.smer = akyJeDalsiSmerVlavo(this.smer);
    },
};

Rozširovanie objektov

Do objektu viete pridať property (a to aj metódu)

aj po jeho vytvorení.

const karel = {
    // všetok doterajší kód
};

karel.dostalFrancouzak = true;
karel.uzZnaLasku = true;

karel.celomVzad = function () {
    // tu môžete používať this
};

Cvičenie: doplňte telo metódy celomVzad

const karel = {
    // všetok doreajší kód
};

karel.celomVzad = function () {
    if (this.smer === SEVER) {
        this.smer = JUH;
      	return;
    }
  
    if (this.smer === VYCHOD) {
        this.smer = ZAPAD;
      	return;
    }
  
    if (this.smer === JUH) {
        this.smer = SEVER;
      	return;
    }
  
    this.smer = VYCHOD;
};

Ďakujem za pozornosť