This article has been localized into Czech by the community.
Pole (fields)
Jak jsme zmínili v úvodu do tříd, mohou být považovány za krabice nebo kontejnery pro data a funkčnost. Funkčnost je pokryta metodami tříd, o kterých si povíme v jednom z dalších článků, zatímco část dat je zajištěna polemi tříd.
V předchozím článku jsme již použili pole v úvodu do příkladu tříd, ale v tomto článku se chci vrátit a začít od začátku, abych vám poskytl úvod do polí a podrobně o nich diskutoval.
Pole třídy je v podstatě jen proměnná obsažená třídou, ale jak uvidíme v některých pozdějších příkladech, nabízí nějakou další funkcionalitu.
Jednoduchá pole
V nejjednodušší formě, je pole třídy, přidáno do třídy, napsáním jeho názvu uvnitř těla třídy, následované středníkem. Ilustrujme to na třídě Dog (Pes) se dvěma poli:
class Dog
{
name;
age;
}
To vytvoří třídu nazvanou Dog (Pes), která obsahuje dvě pole: "name" (jméno) a "age" (věk).
Ale možná byste chtěli svým polím dát počáteční hodnotu - žádný problém, můžete to udělat, stejně jako u běžných proměnných:
class Dog
{
name = "Dog Doe";
age = 7;
}
Použití polí
Ve výchozím nastavení je pole třídy v JavaScriptu veřejné, což znamená, že k němu lze přistupovat jak zevnitř, tak zvenčí třídy. O viditelnosti členů třídy si povíme více později, ale prozatím vyzkoušejme použití polí v úplnějším příkladu:
class Dog
{
name = "Dog Doe";
age = 7;
Describe()
{
return this.name + " is " + this.age + " years old";
}
}
let dog = new Dog();
alert(dog.Describe());
// Dog birthday...
dog.age = dog.age + 1;
alert(dog.Describe());
Jak vidíte, po vytvoření objektu psa a zavolání metody Describe() (Popis), přistupuji k poli age (věk) a přičtu k věku jedničku. Abych prokázal, že se věk změnil, zavolám metodu Describe() znovu. Nyní používáme pole jak zevnitř třídy (v metodě Describe()), tak i zvenčí.
Soukromá pole
Někdy však chcete omezit přístup k poli pouze na vnitřek třídy. To je v JavaScriptu možné definováním pole jako soukromého, a jako koncept se to často označuje jako enkapsulace, protože něco skrýváte interně před uživatelem třídy, což umožňuje pouze samotné třídě manipulovat s daty.
To může znít trochu divně, protože vy jako programátor jste často jak definující, tak spotřebitel třídy, jak jsme právě viděli v předchozích příkladech, ale musíte zde myslet trochu větším měřítkem. Jedním příkladem je velký projekt se stovkami nebo dokonce tisíci třídami, vytvořenými více vývojáři. V takové situaci je důležité, aby tvůrce třídy měl striktní kontrolu nad tím, které členy jsou vystaveny spotřebiteli třídy, kterým by snadno mohl být jiný programátor.
V JavaScriptu je pole označeno jako soukromé předřazením znaku mřížky (#). Když to uděláte, k poli již nemůže být přistupováno zvenčí třídy, ale stále může být přistupováno zevnitř třídy, jak uvidíme v této upravené verzi našeho příkladu třídy Dog (Pes):
class Dog
{
#name = "Dog Doe";
#age = 7;
Describe()
{
return this.#name + " is " + this.#age + " years old";
}
}
let dog = new Dog();
alert(dog.Describe());
// Dog birthday...
dog.#age = dog.#age + 1;
alert(dog.Describe());
Všimněte si, že jsem nyní předřadil názvy polí znakem mřížky (#name a #age). Dále si všimněte, že znak mřížky není operátorem nebo něčím podobným. Stává se součástí názvu pole, jako kterýkoli jiný znak, ale má pro interpret speciální význam, označuje jej jako soukromé.
Pokud se pokusíte tento příklad spustit, nedostanete se daleko. Některé chyby JavaScriptu jsou odhaleny až za běhu, ale tato chyba je objevena již při analýze kódu interpretem, což vede k syntaxní chybě. Když váš kód obsahuje syntaxní chyby, nebude vůbec spuštěn, ale v logu uvidíte chybu, jako je tato:
Uncaught SyntaxError: Private field '#age' must be declared in an enclosing class
Pokud nyní zkusíte spustit příklad bez posledních několika řádků, bude fungovat bez problémů:
class Dog
{
#name = "Dog Doe";
#age = 7;
Describe()
{
return this.#name + " is " + this.#age + " years old";
}
}
let dog = new Dog();
alert(dog.Describe());
Stále přistupujeme k polím, ale pouze zevnitř třídy, což je u soukromých polí stále povoleno. Třída nyní má plnou kontrolu nad poli a budete muset použít veřejnou metodu, jako je metoda Describe(), pro nepřímý přístup k polím.
Pro ještě větší kontrolu nad polem můžeme použít něco, co se nazývá gettery a settery. Jedná se o speciální typy metod, takže se jim budeme věnovat v samostatném článku, až probereme obecné metody tříd.
Shrnutí
Pole jsou jako proměnné, ale pro třídy. Ve výchozím nastavení je lze měnit jak zevnitř, tak i zvenčí třídy, ale toto chování můžete změnit označením jako soukromá pole.