LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> JAK na třídy

V minulém článku o JAK sem shrnul základní metody a mechanismy, které se hodí každému programátorovi. JavaScript je však jazyk objektový, a i JAK je na objektech založen. Jak se s objekty a jejich třídy pracuje, se pokusím vysvětlit v tomto článku.

20.1.2011 00:00 | Ondřej Tůma | Články autora | přečteno 7667×

Základním prvkem knihovny je tedy objekt, instance třídy, resp. instance  JAK třídy. JAK totiž obsahuje obal pro definici a aplikaci tříd, obdobně, jako to známe z ostatních objektových jazyků např. C++. Můžete tak například snadno definovat třídu, která dědí z jiné, nebo je singltonem. První příklad ukazuje jak se takové třídy za pomocí knihovny JAK vytvářejí:
var Terorist = JAK.ClassMaker.makeClass({
NAME: "Terorist",
VERSION: "1.0"
});

Terorist._counter = 0; // statická proměnná
Terorist.prototype.name = ''; // dynamická proměnná

Terorist.prototype.$constructor = function(name){
this.name = name;
Terorist._counter++;
}

Terorist.prototype.$destructor = function(){
Terorist._counter--;
}

Terorist.prototype.talk = function(){
document.write('My name is ' + this.name + ', the ' + this.constructor.NAME);
document.write('. I kill you !
');
}

var ahmed = new Terorist('Ahmed');
ahmed.talk();

document.write('Count of Terorists: '+ Terorist._counter+'
');
V kódu je vidět jak se definuje třída pomocí ClassMakeru. Parametry metody makeClass jsou název a verze třídy. Na dalším řádku je vidět definice statické proměnné. Ta je sdílená napříč všemi instancemi třídy. Dynamická proměnná (tedy lokální pro každou instanci) je přístupná přes operátor this. Přístup do paměti takové proměnné je copy_on_write, tedy vlastní skutečná kopie proměnné nastává až v okamžiku zápisu přes this. Zápis přes Trida.prototype mění statickou hodnotu, kterou uvidí všechny instance které si nevytvořili vlastní kopii zápisem.

Na definici metod není nic zvláštního až na specifickou metodu $constructor. Ta je volána po vytvoření objektu automaticky, pokud existuje. Lze definovat i metodu $destructor, nicméně ta se při mazání automaticky nevolá, a musíte si jí tak zavolat sami. Ostatní kód již netřeba komentovat, vytvoříme instanci třídy a zavoláme její metodu.

Dědičnost

Třída která je potomkem jiné třídy se v JAKu definuje neskutečně jednoduše, prostě metodě makeClass dáte ještě jeden parametr EXTEND a v něm uvedete rodiče oné třídy. Možnosti dědičnosti jsou však značně omezené a to také naznačuje následující ukázka.
var Bomberman = JAK.ClassMaker.makeClass({
NAME: "Bomberman",
VERSION: "1.0",
EXTEND: Terorist
});

Bomberman.prototype.$constructor = function(name, bombs){
this.$super(name);
this.bombs = bombs;
}

Bomberman.prototype.$destructor = function(){
document.write('BUM !!
');
this.$super();
}

Bomberman.prototype.talk = function(){
Terorist.prototype.talk.call(this); // totéž co this.$super();
document.write('I kill you all with my ' + this.bombs + ' bombs.
')
}

var mushafa = new Bomberman('Mushafa', 2);
mushafa.talk();
mushafa.$destructor();
Pokud chceme aby nějaká metoda potomka třídy zavolala metodu svého rodiče, provedeme to metodou $super. Ta volá metodu rodiče, která je stejná jako metoda, ve které je $super použito, viz definice metod $constructor. Je jí tím pádem možné volat pouze v metodě se stejným názvem, tedy v takové, kterou přepisujeme.

Dále můžeme dědit jen z jedné třídy, ale ta může být potomkem jiné. V případě že potřebujete volat libovolnou metodu libovolného předka, použijete zápis Prarodic.prototype.method.call(this, arg1, arg2...), tak jak je to v ukázce u metody Bomberman.prototype.talk. No a nakonec nemůžeme definovat metody, které je možné přepsat.

Interface

Další způsob jak rozšířit funkčnost nějaké třídy je použít Interface (rozhraní). Těch může být uvedeno více, a v případě konfliktů v názvech metod vyhrává metoda z posledního uvedeného rozhraní. Kombinace rodiče (EXTEND) a rozhraní (IMPLEMENT) není vyloučena, což ukazuje i následující kód.
var Hacker = JAK.ClassMaker.makeInterface({
NAME: "Hacker",
VERSION: "1.0",
});

Hacker.prototype.hack = function(){
document.write('Your PC is hacked, cha cha chaaaa!
');
};

var eTerorist = JAK.ClassMaker.makeClass({
NAME: "eTerororist",
VERSION: "1.0",
EXTEND: Terorist,
IMPLEMENT: [Hacker]
});

var farad = new eTerorist('Farad');
farad.hack();
farad.talk();

Singleton a Statická třída

Zvláštní lahůdkou na závěr jsou třídy typu Singleton a Statické třídy, jejich význam je obdobný. Instance těchto tříd nelze vytvořit neboť Singleton může být jen jeden, a statická třída nemůže být dynamická :) Než tuto stručnou a prostou informaci doplním ukázkou kódu, nesmím zapomenou upozornit na to, že i tyto typy tříd se v knihovně sami objevují. Které to jsou neprozradím a uložím to laskavému čtenáři za domácí úkol k prozkoumání.
// Singleton
var BinLadin = JAK.ClassMaker.makeSingleton({
NAME: "BinLadin",
VERSION: "1.0",
EXTEND: Terorist
});

BinLadin.prototype.$constructor = function(){
this.$super(this.constructor.NAME);
}

BinLadin.prototype.talk = function(){
document.write("I'm "+this.name+'. ');
document.write('America must be destroyed !!
');
}

BinLadin.getInstance().talk();
//new BinLadin(); // končí s chybou

// Static
var Zero = JAK.ClassMaker.makeStatic({
NAME: "Zero",
VERSION: "1.0"
});

Zero.value = 0;

console.log(Zero.value);
//new Zero(); // končí s chybou

Závěrem

JavaScript je jazyk objektový, ale jeho přístup k objektům je zcela jiný, než v ostatních objektových jazycích. Knihovna JAK se pokouší tyto rozdíly minimalizovat a jazyk samotný rozšířit. Za sebe mohu říct že se jí to daří a přibližuje webové programování ostatním programátorům, kteří jsou zvyklí na jiné objektové jazyky.

Verze pro tisk

pridej.cz

 

DISKUZE

Interface 20.1.2011 15:29 František Kučera




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze