abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 23:22 | Humor

    Jihokorejská Národní daňová služba (NTS) zabavila kryptoměnu Pre-retogeum (PRTG) v hodnotě 5,6 milionu dolarů. Pochlubila se v tiskové zprávě, do které vložila fotografii zabavených USB flash disků s kryptoměnovými peněženkami spolu se souvisejícími ručně napsanými mnemotechnickými obnovovacími frázemi. Krátce na to byla kryptoměna v hodnotě 4,8 milionu dolarů odcizena. O několik hodin ale vrácena, jelikož PRTG je extrémně nelikvidní, s denním objemem obchodování kolem 332 dolarů a zalistováním na jediné burze, MEXC [Bitcoin.com].

    Ladislav Hagara | Komentářů: 5
    včera 16:33 | Nová verze

    Komunita kolem Linuxu From Scratch (LFS) vydala nové verze knih s návody na instalaci vlastního linuxového systému ze zdrojových kódů Linux From Scratch 13.0 a Beyond Linux From Scratch 13.0. Pouze se systemd.

    Ladislav Hagara | Komentářů: 1
    včera 16:00 | Nová verze

    Byla vydána nová stabilní major verze 25.12 linuxové distribuce primárně určené pro routery a vestavěné systémy OpenWrt (Wikipedie). Jedná se o nástupce předchozí major verze 24.10. Přehled novinek v poznámkách k vydání. Podporováno je více než 2200 zařízení.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za únor (YouTube). Odstraněn byl veškerý kód napsaný ve Swiftu. JavaScriptový engine LibJS byl reimplementován v Rustu.

    Ladislav Hagara | Komentářů: 3
    5.3. 21:11 | Nová verze

    Byla vydána verze 1.94.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example. Zveřejněny byly výsledky průzkumu mezi vývojáři v programovacím jazyce Rust: 2025 State of Rust Survey Results.

    Ladislav Hagara | Komentářů: 7
    5.3. 17:33 | Komunita

    Google zveřejnil seznam 185 organizací přijatých do letošního Google Summer of Code (GSoC). Dle plánu se zájemci přihlašují od 16. do 31. března. Vydělat si mohou od 750 do 6600 dolarů. V Česku a na Slovensku je to 900 dolarů za malý, 1800 dolarů za střední a 3600 dolarů za velký projekt. Další informace v často kladených otázkách (FAQ). K dispozici jsou také statistiky z minulých let.

    Ladislav Hagara | Komentářů: 0
    4.3. 22:55 | Nová verze

    Byla vydána únorová aktualizace aneb nová verze 1.110 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.110 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 8
    4.3. 18:11 | IT novinky

    Apple představil 13palcový MacBook Neo s čipem A18 Pro. V základní konfiguraci za 16 990 Kč.

    Ladislav Hagara | Komentářů: 57
    4.3. 12:22 | Komunita

    Kalifornský zákon AB 1043 platný od 1. ledna 2027 vyžaduje, aby operační systémy požadovaly po uživatelích věk nebo datum narození a skrze API poskytovaly aplikacím informaci, zda je uživatel mladší 13 let, má 13 až 16 let, má 16 až 18 let nebo má alespoň 18 let. Vývojáři linuxových distribucí řeší, co s tím (Ubuntu, Fedora, …).

    Ladislav Hagara | Komentářů: 106
    4.3. 11:44 | Pozvánky

    Konference LinuxDays 2026 proběhne o víkendu 3. a 4. října v Praze v areálu ČVUT v Dejvicích na FIT. Čekají vás desítky přednášek, workshopy, stánky a setkání se spoustou chytrých lidí.

    Petr Krčmář | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (17%)
     (7%)
     (0%)
     (11%)
     (28%)
     (2%)
     (5%)
     (2%)
     (13%)
     (25%)
    Celkem 1029 hlasů
     Komentářů: 25, poslední 3.2. 19:50
    Rozcestník

    Rozšírte si Firefox a Thunderbird - sami! - 4 (JavaScript)

    22. 8. 2005 | Matej Gagyi | Programování | 9724×

    Celý Firefox a ostatné produkty Mozilly sú poskladané z tried napísaných v C++, ktoré samy o sebe skoro nič nevedia. Do kopy ich spája JavaScript, výnimočný skriptovací jazyk. Dnes vám ho priblížim a odhalím jeho tajomstvá.

    Skoro od úplného začiatku štartu je Mozilla ovládaná JavaScriptom. Preto je to aj trochu pomalá, ale za to nevídane flexibilná aplikácia. JavaScript sám o sebe nič nevie, len nejaké počítanie. Ak ho ale obalíte funkčnými kúskami aplikácie, dostanete rýchlo vyvinutú aplikáciu.

    Spojenie komponentov Mozilly s JavaScriptom vykonáva systém XPConnect. O ňom si ale dnes nebudeme hovoriť, je to zložitá téma na niekoľko dielov a možno pre úplne iný seriál.

    Vo vnútri Mozilly je JavaScript vykonávaný enginom SpiderMonkey, ktorý je písaný v jazyku C a je veľmi výkonný. Existuje aj menej výkonná verzia enginu Rhino, pre Jazyk Java.

    JavaScript toho robí naozaj veľa, ale špecifické úlohy, ako kreslenie na obrazovku a sieťovú komunikáciu prenecháva komponentom v jazyku C++. Ak chceme Firefox rozširovať, JavaScriptu sa nevyhneme a musíme si ho do detailov prebrať.

    Na pochopenie dnešného článku musíte mať základné znalosti JavaScriptu. Ale ani jazyk C, alebo C++ vám nebude na škodu. Techniky zmienené v dnešnom článku však nie je potrebné pochopiť.

    Pripravení? Tak poďme na to!

    JavaScript

    JavaScript zdedil svoj vzhľad od jazyka C a preto vyzerá ako procedurálny jazyk. To je ale omyl, JavaScript je prototypový jazyk a má trochu bližšie k funkcionálnym jazykom ako C.

    Amatérski dizajnéri internetových stránok s ľahkosťou použivajú JavaScript a vôbec si neuvedomujú jeho silu a aké problémy prináša vývoj aplikácie takej veľkej ako Firefox. Pri programovaní v JavaScripte musíte poznať techniky s ním spojené a dodržovať disciplínu tak, ako pri každom inom jazyku.

    Prototypy a procedurálne črty jazyka

    Prototyp je množina všetkých premenných objektu. JavaScript nepozná triedy, len dynamické prototypy. Existuje len jeden druh objektov a to je objekt. Objekty sa vytvárajú jednoduchým použitím názvu premennej.

    Celý program je spustený v globálnej funkcii, alebo aj globálnom rozsahu (ang. global scope). Každá funkcia, hlavne globálna, môže vo svojom tele definovať funkcie a premenné. Tie sú prístupné len z podfunkcií danej funkcie.

    Ak je v niektorej podfunkcii potrebná prechodná premenná, je potrebné ju deklarovať kľúčovým slovom var. Ak toto slovo nie je použité a v nadfunkcii už existuje premenná s rovnakým menom, zostane pri zápise hodnoty do tejto premennej nová hodnota zapísaná aj po ukončení podfunkcie.

    function nadfunkcia() {
      var premenna = 2;
      funkcia podfunkcia(n) {
        // nová premenná
        //var premenná = n;
        // premenná z nadfunkcie
        premenná = n;
      }
      podfunkcia(5);
      // Otvoríme okno a pozrieme si hodnotu premennej
      alert(premenna);
    }

    Funkcie sú objekty. Funkciu môžete vložiť do premennej:

    var func = function { kod };

    Funkcie môžete dynamicky vytvárať:

    var func = new Function([arg1, arg2, ..., argn], "kod");

    Alebo môžete vykonať kód priamo pomocou funkcie eval:

    eval("kod");

    Funkcia eval je však zložitejšia časť JavaScriptu, preto si o nej povieme niekedy nabudúce.

    Čo sa týka procedurálnych čŕt jazyka, platia skoro rovnaké princípy ako v jazyku C:

    function factorial(n) {
        var fact = 1;
        for(; n > 0; fact *= n--) ;
        return fact;
    }

    Funkcia factorial počíta faktoriál čísla n (n!). Ostrieľaný programátor hneď spozná, že je písaná céčkovým štýlom.

    Prototypy a objekty

    Každý objekt má dynamický počet premenných, ktoré môžu byť tiež objekty, alebo primitívne typy. K premenným objektov sa pristupuje notáciami objekt.premenná a objekt[kľúč], pričom platí:

    objekt.premenná == objekt["premenná"]

    Za zmienku stojí typová konverzia:

    objekt[1] == objekt[01] == objekt["1"] != objekt["01"]

    Pozor, notácie objekt.1, aj objekt.01 sú syntaktické chyby!

    V JavaScripte je vždy prístupný bezmenný objekt označovaný [[scope]]. Scope, čiže rozsah, obsahuje všetky lokálne premenné funkcie. Cez tento objekt sa pristupuje na všetky lokálne premenné.

    Kľúčom môže byť akýkoľvek objekt, pričom sa rozlišuje konštruktor, ktorý ho vytvoril. Takýmto spôsobom je možné vytvárať hashovacie tabuľky.

    Uzávierky (closures)

    Uzávierky, ang. closures, je vlastnosť prevzatá z funkcionálnych jazykov. Ide o funkcie, ktoré sú uzavreté do istého parametrizovaného prostredia. V JavaScripte sú to funkcie, ktoré sa nachádzajú vo vnútri iných funkcií, používajú premenné svojich nadfunkcií a sú prístupné z vonkajšku svojej nadfunkcie.

    V ľudskej reči to znamená, že dáte funkcii časť parametrov a zvyšné môžete doplniť neskôr. Je to užitočné pri objektovo orientovaných postupoch (uzatváranie kódu) a pri optimalizácii výkonu.

    function combinations(n) {
        // vypočítame n!
        var nf = factorial(n)
        // Vrátime odkaz na vnútornú funkciu
        return function(k) {
            return nf / (factorial(k) * factorial(n - k));
        }
    }
    // Koľko košických cestovných lístkov musím nazbierať,
    // aby som mal všetky ich kombinácie a mohol cestovať zadarmo?
    // Cestovný lístok MHD v Košiciach má 9 políčok a
    // 4 z nich sa predierkujú

    alert(combinations(9)(4));
    // Koľko rôznych priemerov môže mať žiak z predmetu
    // na konci roka, ak nazbiera 3 až 5 známok?

    var closure = combinations(5);
    alert(closure(3) + closure(4) + closure(5));

    Funkcia combinations(n)(k) počíta kombinácie n prvkov k-tej triedy. Predpokladajme, že potrebujeme vypočítať viac kombinácií n prvkov. V tom prípade sa algoritmus zbavil opakovaného počítania factoriálu n.

    Po ukončení funkcie combinations(n), zostáva jej vnútorná funkcia pripravená na volanie a pamätá si všetky premenné tak, ako ich zanechala funkcia conbinations(n). Hodnoty premenných môže aj čítať, aj meniť.

    Uzávierky umožňujú použitie objektovo orientovaných techník v JavaScripte. Verejné funkcie totiž vidia do vnútra svojho konštruktora a vidia ho v stave, v ktorom skončil svoje volanie.

    OOP techniky

    V diskusiách je často možné sa stretnúť s tvrdením, že JavaScript nie je OO jazyk. Majú pravdu, pretože je zamýšlaný prototypovo, ale nanešťastie dotyčné tvrdenie vychádza z úplne mylných faktov.

    V JavaScripte platí, že nič nie je privátne. Dôležitá vlastnosť OO jazykov sú privátne premenné a metódy. JavaScript dokáže aj túto vlastnosť elegantne emulovať. Konštruktor síce vytvorí v objekte this verejné metódy, ale privátne môže vytvoriť ako premenné funkcie pomocou kľúčového slova var, alebo function.

    Všetky verejné metódy objektu vidia do konštruktora a vidia ho v stave, v akom sa ukončilo jeho volanie. Verejné funkcie vidia, a tým pádom môžu pristupovať k premenným a metódam, ktoré sú definované v konštruktore.

    function Organism() {
    	/* privátna časť */
     	var health = 100;
    	function _getHealth() {
    		return health;
    	}
    	function _setHealth(h) {
    		health = h;
    	}
    	/* verejná časť */
    	this.getHealth = function () {
    		return _getHealth();
    	};
    	this.setHealth = function(h) {
    		if(health == 0) {
    			throw("ResurectionException");
    		} else if(h <= 0) {
    			throw("MurdException");
    		} else {
    			_setHealth(h);
    		}
    	};
    	this.kill = function() {
    		_setHealth(0);
    	};
    }

    Náš konštruktor vytvorí objekt žijúceho organizmu. Organizmus má zdravie - privátnu premennú health. Zdravie je meniteľné pomocou prístupových metód getHealth, setHealth() a kill(). Organizmus môžete zabiť iba funkciou kill(), ale potom sa vám ho už nepodarí oživiť.

    Metóda setHealth() vyhodí výnimku pomocou príkazu throw() ak sa pokúsite organizmus zabiť, alebo oživiť. Tu je ukážka odchytávania výnimok a použitia organizmu:

    var microb = new Organism();
    microb.setHealth(50);
    alert(microb.getHealth());
    try {
      microb.setHealth(0); // Nesmieme organizmus zabiť ...
    } catch(e) {
      print(e); // .. odchytíme výnimku
    }
    microb.kill();
    alert(microb.getHealth());
    try {
      microb.setHealth(100); // organizmus je už mŕtvy ...
    } catch(e) {
      print(e); // ... odchytíme výnimku
    }

    Premenné prototype, constructor a dedičnosť

    Ak sa snažíte prečítať hodnotu z premennej objektu object.premenna, ktorý nemá požadovanú premennú, JavaScript sa túto premennú pokúsi nájsť v objekte object.prototype. Ak ju nenájde, skúsi object.prototype.prototype a takto pokračuje až kým nenarazí v tomto reťazci na hodnotu null.

    Premennú prototype má každý object a prenáša sa z konštruktorov na nové objekty. Taktýmto spôsobom sa dá docieliť klasická dedičnosť:

    function Human(name) {
      this.name = name ? name : "Nobody";
      this.talk = function talk(text) {
        alert(name + " say's: " + text);
      }
    }
    Human.prototype = new Organism();

    Konštruktor Human vytvorí triedu človeka a ten okrem toho, že žije, má aj meno a vie hovoriť.

    Viacnásobné dedenie je možné docieliť volaním nadkonštruktorov z konštruktora. Premenná this sa presunie z volania konštruktora do nadkonštruktora a ten nastaví požadované premenné a metódy objektu:

    function Mechanism() {
      this.eval = function(expr) {
        alert(eval(expr));
      }
    }
    function RoboCop {
      Human();
      Mechanism();
    }

    RoboCop má zdravie a vie rozprávať, to zdedil od konštruktoru Human(). Okrem toho vie robiť aj zložité výpočty presne tak, ako Mechanism().

    Premenná object.constructor má ako hodnotu konštruktor, ktorý objekt vytvoril. Nedá sa však efektívne identifikovať nadtriedy objektov a tým pádom ani používať viacnásobné dedenie na miestach, kde je do úvahy braná premenná constructor.

    Záver

    Dnešný článok doslova sumarizuje všetky dôležité vlastnosti jazyka JavaScript. Všetky sú primerane užitočné pri tvorbe rozšírení a uľahčia vám prácu v rôznych situáciách.

    My však väčšinu z týchto techník v tutoriáloch používať nebudeme. Článok je veľmi zložitý a nechcem vás nútiť rozumieť všetkým jeho častiam. Ak ste teda nepochopili obsah článku, nevadí.

    Nabudúce si pripravíme jednoduchší tutoriál a pridáme nášmu užitočnému rozšíreniu nastavenia vzhľadu. A možno aj trochu viac.

    Nejčtenější články posledního měsíce

    Týden na ITBiz: AI již před rokem psala téměř třetinu nového kódu
    Týden na ITBiz: Ohlášení podle nového zákona o kybernetické bezpečnosti provedlo přes 4800 organizací
    Levné klíče na Windows 11 a Office včetně bundlů a další software

    Nejkomentovanější články posledního měsíce

      všechny statistiky »

    Seriál Rozšírte si Firefox a Thunderbird - sami! (dílů: 8)

    Rozšírte si Firefox a Thunderbird - sami! (první díl)
    <—« Rozšírte si Firefox a Thunderbird - sami! - 3
    »—> Rozšírte si Firefox a Thunderbird - sami! - 5 (Nastavenia)
    Rozšírte si Firefox a Thunderbird - sami! - 8 (Záver) (poslední díl)

    Související články

    Rozšírte si Firefox a Thunderbird - sami!
    Rozšírte si Firefox a Thunderbird - sami! - II
    Rozšírte si Firefox a Thunderbird - sami! - 3
    Rozšírte si Firefox a Thunderbird - sami! - 5 (Nastavenia)
    Rozšírte si Firefox a Thunderbird - sami! - 6 (Lokalizácia)
    Rozšírte si Firefox a Thunderbird - sami! - 7 (XHTML)
    Rozšírte si Firefox a Thunderbird - sami! - 8 (Záver)
    Rozšiřte si Firefox!
    Rozšiřte si Thunderbird!
    Rozhovor s Pavlem Cvrčkem z týmu CZilla
    Sunbird
    Thunderbird I
    Thunderbird II
    Firefox
    Liber Mozillae aneb tajemná Kniha Mozilly
    Kde známé projekty ke svým jménům přišly...

    Další články z této rubriky

    LLVM a Clang – více než dobrá náhrada za GCC
    Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
    Reverzujeme ovladače pro USB HID zařízení
    Linux: systémové volání splice()
    Programování v jazyce Vala - základní prvky jazyka
           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    22.8.2005 07:45 schrapnel
    Rozbalit Rozbalit vše mato :)
    mato mato :)) si dobry, ale aj tak si myslim, ze by si si mal najst zenu ;)
    elviin avatar 22.8.2005 09:31 elviin | skóre: 29 | blog: elviin | Plzeň-Praha
    Rozbalit Rozbalit vše Výjimky
    Jak funguje vnitřní mechanismus zachytávání výjimek? Jak určim jakýho typu výjimku požaduju? Je to tedy něco jako elipsa v C++?
    try {
    }
    catch(...){
    }
    
    elviin avatar 22.8.2005 09:36 elviin | skóre: 29 | blog: elviin | Plzeň-Praha
    Rozbalit Rozbalit vše Re: Výjimky
    Samozrejme ... jeden druh objektu, ale nejaka diferenciace-specifikace neni treba?
    Yin avatar 22.8.2005 14:29 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
    Rozbalit Rozbalit vše Re: Výjimky

    Napísal som čo bolo v mojích silách (článok, ktorý sa zaoberal aj týmito témami bol 2,5 krát taký dlhý). Uvedomte si 0.1% náznaku typovej kontroly v JS.

    Predpokladajme, že komponenty aplikácie (C,C++,Java,...) Vám dodajú do JavaScriptu správne dátové typy. Nemusíte sa o typy veľmi starať, aj keď JS ponúka mnoho techník, ako rozlišovať Objekty.. JS je Prototypový jazyk, nie OO, ani proceduránly, ani Funkcionálny,...

    Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.
    Yin avatar 22.8.2005 14:24 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
    Rozbalit Rozbalit vše Re: Výjimky

    Ak pracujete na projekte, kde sa používa JavaScript, pravdepodobne sú všetky JS komponenty (triedy, časi programu, ...) vyvýjané na jednom pracovisku. Pri návrhu si musíte určiť akým spôsobom budete (a či vôbec potrebujete) rozoznávať jednu výnimku od druhej. (rozličný začiatok textu, špeciálny objekt, ...)

    Na FLOSS projekte je štýl JS kódu často viac procedurálne orientovaný... teda aspoň na toľko nakoľko to dovolí povaha JS.

    Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.
    22.8.2005 10:36 Marcel Šebek | skóre: 21 | blog: c
    Rozbalit Rozbalit vše 0 * cokoliv = 0
    Nemá být proměnná ve funkci faktoriál inicializovaná na 1? Takhle to musí vždy vrátit 0.
    Real programmers don't comment their code. If it was hard to write, it should be hard to read.
    Yin avatar 22.8.2005 12:04 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
    Rozbalit Rozbalit vše Re: 0 * cokoliv = 0
    Áno, moja chyba... popis hovorí za seba, bola to len ukážka!
    Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.