Milan Herda, 06/2020
Vytvorte objekt reprezentujúci zviera.
Objekt bude mať vlastnosti:
Bude mať aj metódu vydajZvuk, ktorá vráti reťazec v tvare:
'{nazov} robi {zvuk}'
const zviera = {
nazov: 'pes',
pocetNoh: 4,
vieLietat: false,
zvuk: 'haf',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
},
};
Vytvorte objekty reprezentujúce psa, mačku a líšku
const pes = {
nazov: 'pes',
pocetNoh: 4,
vieLietat: false,
zvuk: 'haf',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
},
};
const macka = {
nazov: 'macka',
pocetNoh: 4,
vieLietat: false,
zvuk: 'mňau',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
}
};
const liska = {
nazov: 'liska',
pocetNoh: 4,
vieLietat: false,
zvuk: 'what does the fox say',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
}
};
const pes = {
nazov: 'pes',
pocetNoh: 4,
vieLietat: false,
zvuk: 'haf',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
},
};
const macka = {
nazov: 'macka',
pocetNoh: 4,
vieLietat: false,
zvuk: 'mňau',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
}
};
const liska = {
nazov: 'liska',
pocetNoh: 4,
vieLietat: false,
zvuk: 'what does the fox say',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
}
};
Ak potrebujeme vytvárať viacero
objekto, ktoré majú rovnaké
vlastnosti, ale rôzne hodnoty
pre ne, tak:
toto nie je ideálny postup.
Pretože nie je opakovateľný
a danú inštanciu musíte
vždy ručne naprogramovať.
Vymyslite spôsob, ako tvoriť objekty zvierat bez toho, aby sme vždy museli nanovo vytvárať metódu vydajZvuk
const vydajZvuk = function () {
return this.nazov + ' robí ' + this.zvuk;
};
const pes = {
nazov: 'pes',
pocetNoh: 4,
vieLietat: false,
zvuk: 'haf',
vydajZvuk: vydajZvuk,
};
const macka = {
nazov: 'macka',
pocetNoh: 4,
vieLietat: false,
zvuk: 'mňau',
vydajZvuk: vydajZvuk,
};
const liska = {
nazov: 'liska',
pocetNoh: 4,
vieLietat: false,
zvuk: 'what does the fox say',
vydajZvuk: vydajZvuk,
};
const vydajZvuk = function () {
return this.nazov + ' robí ' + this.zvuk;
};
const pes = {
nazov: 'pes',
pocetNoh: 4,
vieLietat: false,
zvuk: 'haf',
vydajZvuk: vydajZvuk,
};
const macka = {
nazov: 'macka',
pocetNoh: 4,
vieLietat: false,
zvuk: 'mňau',
vydajZvuk: vydajZvuk,
};
const liska = {
nazov: 'liska',
pocetNoh: 4,
vieLietat: false,
zvuk: 'what does the fox say',
vydajZvuk: vydajZvuk,
};
Lepšie riešenie je vytvoriť tzv.
factory funkciu,
v ktorej sa nám vytvorí objekt
podľa nejakej "šablóny".
Vytvorte funkciu, ktorá vo vnútri vytvorí objekt zvieraťa so všetkými vlastnosťami nastavenými na nejakú defaultnú hodnotu a metódou vydajZvuk.
Tento objekt sa z funkcie vráti a následne volajúci kód môže nastaviť potrebné vlastnosti.
const vytvorZviera = function () {
return {
nazov: 'názov zvieraťa',
pocetNoh: 4,
vieLietat: false,
zvuk: 'aký zvuk zviera vydáva?',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
},
};
};
const pes = vytvorZviera();
pes.nazov = 'pes';
pes.zvuk = 'haf';
Lepšie, ale stále celkom neužitočné.
Dajte factory funkcii parametre, podľa ktorých sa nastavia vlastnosti zvieraťa.
onst vytvorZviera = function (nazov, pocetNoh, vieLietat, zvuk) {
return {
nazov: nazov,
pocetNoh: pocetNoh,
vieLietat: vieLietat,
zvuk: zvuk,
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
},
};
};
const pes = vytvorZviera('pes', 4, false, 'haf');
Aby sme nemuseli nastavovať všetky argumenty, tak môžeme namiesto zoznamu argumentov poslať iba jeden, ktorým bude objekt iba s tými vlastnosťami, ktoré chceme nastaviť.
Namiesto zoznamu argumentov pošlite do factory funkcie iba jeden, ktorým bude objekt iba s tými vlastnosťami, ktoré chceme nastaviť :)
const vytvorZviera = function (vlastnosti) {
const zviera = {
nazov: 'názov zvieraťa',
pocetNoh: 4,
vieLietat: false,
zvuk: '???',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
},
};
if (vlastnosti.nazov !== undefined) {
zviera.nazov = vlastnosti.nazov;
}
if (vlastnosti.pocetNoh !== undefined) {
zviera.pocetNoh = vlastnosti.pocetNoh;
}
if (vlastnosti.vieLietat !== undefined) {
zviera.vieLietat = vlastnosti.vieLietat;
}
if (vlastnosti.zvuk !== undefined) {
zviera.zvuk = vlastnosti.zvuk;
}
return zviera;
};
const pes = vytvorZviera({
nazov: 'pes',
zvuk: 'haf',
});
Skúste factory funkciu skrátiť.
Tip: použite cyklus for..in
const vytvorZviera = function (vlastnosti) {
const zviera = {
nazov: 'názov zvieraťa',
pocetNoh: 4,
vieLietat: false,
zvuk: '???',
vydajZvuk: function () {
return this.nazov + ' robí ' + this.zvuk;
},
};
for (let vlastnost in vlastnosti) {
zviera[vlastnost] = vlastnosti[vlastnost];
}
return zviera;
};
const pes = vytvorZviera({
nazov: 'pes',
zvuk: 'haf',
});
Kľúčové slovo this nie je obyčajná premenná.
Jeho hodnota sa vyhodnocuje vždy až vo chvíli použitia/volania a odvoláva sa na objekt, nad ktorým bola funkcia(!) zavolaná.
Ak je funkcia volaná mimo objektu, tak this sa defaultne nastavuje na globálny objekt
(v prehliadačoch je to window, v prostredí node.js je to global)
Ak je to potrebné, tak pri volaní viete this predefinovať.
Funkcie k tomu majú metódy call a apply
pes.vydajZvuk(); // pes robí haf
pes.vydajZvyk.call(macka); // macka robí mňau
pes.vydajZvuk.apply(macka); // macka robí mňau