Metodu můžeme také pÅiÅadit samotné tÅÃdÄ jako celku. Takové metody se nazývajà statické.
V deklaraci tÅÃdy jsou pÅedznamenány klÃÄovým slovem static, napÅÃklad:
class Uživatel {
static statickáMetoda() {
alert(this === Uživatel);
}
}
Uživatel.statickáMetoda(); // true
To ve skuteÄnosti udÄlá totéž, jako kdybychom tuto metodu pÅÃmo pÅiÅadili jako vlastnost:
class Uživatel { }
Uživatel.statickáMetoda = function() {
alert(this === Uživatel);
};
Uživatel.statickáMetoda(); // true
Hodnota this ve volánà Uživatel.statickáMetoda() je samotný tÅÃdnà konstruktor Uživatel (podle pravidla âobjekt pÅed teÄkouâ).
Statické metody se obvykle použÃvajà k implementaci funkcÃ, které patÅà tÅÃdÄ jako celku, ale nepatÅà žádnému jejÃmu konkrétnÃmu objektu.
NapÅÃklad máme objekty tÅÃdy Älánek a potÅebujeme funkci, která je bude porovnávat.
PÅirozené ÅeÅ¡enà by bylo pÅidat statickou metodu Älánek.porovnej:
class Älánek {
constructor(titulek, datum) {
this.titulek = titulek;
this.datum = datum;
}
static porovnej(ÄlánekA, ÄlánekB) {
return ÄlánekA.datum - ÄlánekB.datum;
}
}
// použitÃ
let Älánky = [
new Älánek("HTML", new Date(2019, 1, 1)),
new Älánek("CSS", new Date(2019, 0, 1)),
new Älánek("JavaScript", new Date(2019, 11, 1))
];
Älánky.sort(Älánek.porovnej);
alert( Älánky[0].titulek ); // CSS
Zde metoda Älánek.porovnej stojà ânadâ Älánky jako způsob jejich porovnávánÃ. Nenà to metoda Älánku, ale metoda celé tÅÃdy.
Jiným pÅÃkladem může být tzv. âtovárnÃâ metoda.
Dejme tomu, že potÅebujeme vÃce způsobů, jak vytvoÅit Älánek:
- VytvoÅit jej ze zadaných parametrů (
titulek,datumatd.). - VytvoÅit prázdný Älánek s dneÅ¡nÃm datem.
- â¦nebo nÄjak jinak.
Prvnà způsob můžeme implementovat konstruktorem. A pro druhý můžeme vytvoÅit statickou metodu tÅÃdy.
NapÅÃklad Älánek.vytvoÅDneÅ¡nÃ() zde:
class Älánek {
constructor(titulek, datum) {
this.titulek = titulek;
this.datum = datum;
}
static vytvoÅDneÅ¡nÃ() {
// pamatujte, že this = Älánek
return new this("DneÅ¡nà pÅehled", new Date());
}
}
let Älánek = Älánek.vytvoÅDneÅ¡nÃ();
alert( Älánek.titulek ); // DneÅ¡nà pÅehled
Nynà pokaždé, když budeme potÅebovat vytvoÅit dneÅ¡nà pÅehled, můžeme volat Älánek.vytvoÅDneÅ¡nÃ(). OpÄt to nenà metoda Älánku, ale metoda celé tÅÃdy.
Statické metody se také použÃvajà ve tÅÃdách vztahujÃcÃch se k databázÃm pro hledánÃ, ukládánà a odstraÅovánà záznamů z databáze, napÅÃklad:
// pÅedpokládejme, že Älánek je speciálnà tÅÃda pro práci s Älánky
// statická metoda pro odstranÄnà Älánku podle jeho id:
Älánek.odstraÅ({id: 12345});
Statické metody lze volat na tÅÃdách, ale ne na jednotlivých objektech.
Nebude fungovat napÅÃklad tento kód:
// ...
Älánek.vytvoÅDneÅ¡nÃ(); /// Chyba: Älánek.vytvoÅDneÅ¡nà nenà funkce
Statické vlastnosti
Můžeme vytváÅet i statické vlastnosti. Vypadajà jako regulérnà tÅÃdnà vlastnosti, ale jsou pÅedznamenány static:
class Älánek {
static vydavatel = "Ilja Kantor";
}
alert( Älánek.vydavatel ); // Ilja Kantor
To je totéž jako pÅÃmé pÅiÅazenà do tÅÃdy Älánek:
Älánek.vydavatel = "Ilja Kantor";
DÄdiÄnost statických vlastnostà a metod
Statické vlastnosti a metody se dÄdÃ.
NapÅÃklad ZvÃÅe.porovnej a ZvÃÅe.planeta v následujÃcÃm kódu budou zdÄdÄny a budou dostupné jako KrálÃk.porovnej a KrálÃk.planeta:
class ZvÃÅe {
static planeta = "ZemÄ";
constructor(jméno, rychlost) {
this.rychlost = rychlost;
this.jméno = jméno;
}
bÄž(rychlost = 0) {
this.rychlost += rychlost;
alert(`${this.jméno} bÄžà rychlostà ${this.rychlost}.`);
}
static porovnej(zvÃÅeA, zvÃÅeB) {
return zvÃÅeA.rychlost - zvÃÅeB.rychlost;
}
}
// ZdÄdÄn ze ZvÃÅe
class KrálÃk extends ZvÃÅe {
schovejSe() {
alert(`${this.jméno} se schovává!`);
}
}
let králÃci = [
new KrálÃk("BÃlý králÃk", 10),
new KrálÃk("Äerný králÃk", 5)
];
králÃci.sort(KrálÃk.porovnej);
králÃci[0].bÄž(); // Äerný králÃk bÄžà rychlostà 5.
alert(KrálÃk.planeta); // ZemÄ
Když nynà zavoláme KrálÃk.porovnej, bude volána zdÄdÄná metoda ZvÃÅe.porovnej.
Jak to funguje? OpÄt pomocà prototypů. Jak jste už možná uhádli, extends vložà tÅÃdÄ KrálÃk do [[Prototype]] odkaz na tÅÃdu ZvÃÅe.
KrálÃk extends ZvÃÅe tedy vytvoÅà dva odkazy [[Prototype]]:
- Funkce
KrálÃkje prototypovÄ zdÄdÄna z funkceZvÃÅe. KrálÃk.prototypeje prototypovÄ zdÄdÄn zeZvÃÅe.prototype.
Výsledkem je, že dÄdiÄnost funguje pro regulérnà i pro statické metody.
OvÄÅme si to kódem:
class ZvÃÅe {}
class KrálÃk extends ZvÃÅe {}
// pro statické metody
alert(KrálÃk.__proto__ === ZvÃÅe); // true
// pro regulérnà metody
alert(KrálÃk.prototype.__proto__ === ZvÃÅe.prototype); // true
ShrnutÃ
Statické metody se použÃvajà pro funkcionalitu, která patÅà tÅÃdÄ âjako celkuâ a nevztahuje se ke konkrétnà instanci tÅÃdy.
NapÅÃklad metoda pro porovnánà Älánek.porovnej(Älánek1, Älánek2) nebo továrnà metoda Älánek.vytvoÅDneÅ¡nÃ().
V deklaraci tÅÃdy jsou oznaÄeny klÃÄovým slovem static.
Statické vlastnosti použÃváme tehdy, když chceme uložit data na úrovni tÅÃdy, rovnÄž nespojená s žádnou instancÃ.
Syntaxe je:
class MojeTÅÃda {
static vlastnost = ...;
static metoda() {
...
}
}
Technicky je statická deklarace totéž jako pÅiÅazenà samotné tÅÃdÄ:
MojeTÅÃda.vlastnost = ...
MojeTÅÃda.metoda = ...
Statické vlastnosti a metody se dÄdÃ.
Pro class B extends A prototyp samotné tÅÃdy B ukazuje na tÅÃdu A: B.[[Prototype]] = A. Jestliže se tedy pole nenajde v B, hledánà bude pokraÄovat v A.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)