JavaScript

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
JavaScript
Neoficiální logo JavaScriptu
Paradigma: objektový, funkcionální
Vznikl v: 1995
Autor: Brendan Eich
Vývojář: Netscape Communications Corporation, Mozilla Foundation
Poslední verze: 1.8.5[1] / 22. března 2011
Typová kontrola: dynamická, duck-typing
Hlavní implementace: KJS, Rhino, SpiderMonkey, V8, Chakra
Ovlivněn jazyky: Java, Self, C, Scheme
Ovlivnil jazyky: ActionScript, CoffeeScript, Dart, JScript .NET, Objective-J, QML, TypeScript, Node.js, LiveScript

JavaScript je multiplatformní, objektově orientovaný skriptovací jazyk, jehož autorem je Brendan Eich z tehdejší společnosti Netscape.

Nyní se zpravidla používá jako interpretovaný programovací jazyk pro WWW stránky, často vkládaný přímo do HTML kódu stránky. Jsou jím obvykle ovládány různé interaktivní prvky GUI (tlačítka, textová políčka) nebo tvořeny animace a efekty obrázků.

Jeho syntaxe patří do rodiny jazyků C/C++/Java. Slovo Java je však součástí jeho názvu pouze z marketingových důvodů a s programovacím jazykem Java jej vedle názvu spojuje jen podobná syntaxe. JavaScript byl v červenci 1997 standardizován asociací ECMA (European Computer Manufacturers Association) a v srpnu 1998 ISO (International Organization for Standardization). Standardizovaná verze JavaScriptu je pojmenována jako ECMAScript a z ní byly odvozeny i další implementace, jako je například ActionScript.

JavaScript byl původně obchodní název implementace společnosti Netscape, kde byl vyvíjen nejprve pod názvem Mocha, později LiveScript, ohlášen byl společně se společností Sun Microsystems v prosinci 1995 jako doplněk k jazykům HTML a Java. Pro verzi firmy Microsoft je použit název JScript. Ten je podporován platformou .NET.

Program v JavaScriptu se obvykle spouští až po stažení WWW stránky z Internetu (tzv. na straně klienta), na rozdíl od ostatních jiných interpretovaných programovacích jazyků (např. PHP a ASP), které se spouštějí na straně serveru ještě před stažením z Internetu. Z toho plynou jistá bezpečností omezení, JavaScript např. nemůže pracovat se soubory, aby tím neohrozil soukromí uživatele.

JavaScript je možné použít i na straně serveru. První implementací JavaScriptu na straně serveru byl LiveWire firmy Netscape vypuštěný roku 1996, dnes existuje několik možností včetně opensource implementace Rhinola založené na Rhino, gcj, Node.js a Apache.

Kromě DHTML se JavaScript používá k psaní rozšíření pro mnohé aplikace, například Adobe Acrobat.

JavaScript je také možno spouštět v operačních systémech Windows pomocí programu Windows Script Host a nahradit tak dávkové soubory MS-DOS.

Rysy objektově orientovaného programování[editovat | editovat zdroj]

Dynamické[editovat | editovat zdroj]

Dynamické přiřazení typů (Dynamic typing)[editovat | editovat zdroj]

Stejně jako ve většině skriptovacích jazyků, jsou typy asociovány s hodnotami místo proměnných. Kupříkladu proměnné x může být přiřazena hodnota v podobě celočíselného typu, později řetězce atd. JavaScript pochopitelně podporuje řadu způsobů jak typ objektu otestovat.

Objekty jako asociativní pole (objects as associative fields)[editovat | editovat zdroj]

JavaScript je převážně objektově založený. Objekty jsou asociativními poli, rozšířenými o tzv. prototypy (viz níže). Názvy atributů objektů jsou klíči asociativního pole: obj.x = 10 a obj[“x“] = 10 jsou tedy ekvivalentními výrazy, první varianta používá oddělení pomocí znaku tečky především pro zjednodušující účely. Atributy a jejich hodnoty mohou být přidávány, měněny nebo mazány za běhu programu. Atributy objektu mohou být rovněž vyčteny pomocí for...in cyklu. V tom se však promítnou i zděděné vlastnosti (z prototypu). Pokud se toho chceme vyvarovat, je dobré použít ještě metodu hasOwnProperty.

Runtime evaluation (= míra možných akcí proveditelných za běhu programu)[editovat | editovat zdroj]

Pro úplnost nutno zmínit, že JavaScript v sobě zahrnuje funkci eval, která je schopna provádět příkazy předávané jako řetězce přímo za běhu programu, což je však celkem běžným rysem interpretovaných jazyků, nejedná se tedy o žádnou specialitu JavaScriptu jako takového.

Funkcionální[editovat | editovat zdroj]

Funkce první třídy (first-class functions)[editovat | editovat zdroj]

Označení funkce první třídy vyjadřuje, že funkce jsou samy o sobě také objekty. Jako takové, mají tedy své atributy a mohou být předány dále, anebo s nimi lze manipulovat jako s kterýmkoli jiným objektem. Níže jsou uvedeny další významy funkcí (jako konstruktory a metody).

Anonymní (vnitřní) funkce a uzávěry (closures)[editovat | editovat zdroj]

Vnitřní funkce (neboli funkce definované uvnitř jiných (vnějších) funkcí) jsou vytvořeny při každém zavolání funkce nadřazené, a proměnné funkcí vnějších existují po dobu existence funkce vnitřní, dokonce i po ukončení zvolání (tedy i po navrácení této vnitřní funkce, má daná funkce stále přístup k proměnným své funkce vnější) – toto je mechanismus v JavaScriptu nazývaný jako closures - uzávěry.

Prototypové (prototype-based)[editovat | editovat zdroj]

Prototypy (Prototypes)[editovat | editovat zdroj]

Přestože JavaScript nedisponuje klasickým konceptem třída-instance, typickým pro objektově orientované jazyky, disponuje rysem, který tento mechanismus částečně nahrazuje – prototypováním. Díky prototypování je dále JavaScript schopen simulovat mnoho principů a vlastností třídově založených (class-based) mechanismů, například dědičnost, která je u JavaScriptu nazývána právě jako dědičnost prototypová, která je vysvětlena na příkladu níže.

Funkce jako konstruktory objektů (Functions as constructors)[editovat | editovat zdroj]

Funkce tedy mají v JavaScriptu kromě své běžné role význam jako konstruktory objektů. Voláním konstruktoru pomocí operátoru new se pak vytvoří nový objekt (instance). Vlastnost objektu se deklaruje přes klíčové slovo this. Přímo při vytváření objektu lze tedy přejímáním parametrů volaného konstruktoru inicializovat jednotlivé proměnné. Atribut prototype dané funkce potom určuje prototyp nově vytvořeného objektu. Příklad konstruktoru třídy Auto:

 
// Definice konstruktoru
function Auto(znacka, spz) {
  this.znacka = znacka;
  this.spz = spz;
  this.vypisZnacku = function () {
    alert(this.znacka);
  };
}
// Vytvoření nového auta
var mojeAuto = new Auto("mercedes", "3A4983");
// Zavolání metody
mojeAuto.vypisZnacku();


Funkce jako metody (Functions as methods)[editovat | editovat zdroj]

Na rozdíl od většiny objektově orientovaných jazyků, u JavaScriptu nerozlišuje mezi definicí metody a definicí funkce. Znatelný rozdíl však vyvstane při volání – funkce může být volána jako metoda. Je-li funkce volána jako metoda objektu, je se svým objektem svázána klíčovým slovem this.

Dědičnost (Inheritance)[editovat | editovat zdroj]

Podrobnější informace naleznete v článku Dědičnost (objektově orientované programování).

Ačkoliv má JavaScript určité prvky dědičnosti, nejedná se o klasickou dědičnost známou z typových jazyků C++ nebo Java. JavaScript nepodporuje zápis tříd (pouze konstruktor) a s tím spojenou hierarchii tříd, proto lze hovořit spíše o jakési simulaci (viz oddíl prototypy výše) dědičnosti, nazvanou dědičnost prototypová. Prototyp slouží jako zvláštní objekt, který je přidružen každé funkci (tedy i k funkci jako konstruktoru). Všechny objekty inicializované skrze nějaký konstruktor dědí, respektive sdílejí, vlastnosti a metody obsažené právě v prototypu daného konstruktoru.

Podíváte-li se zpět na zápis konstruktoru auto, v objektu je vložená také metoda vypisZnacku(). Technicky má v paměti každá instance této "třídy" lokální kopii této metody, což je přinejmenším z hlediska správy paměti nevhodné. Právě tento problém řeší prototypy, neboť stačí metodu deklarovat na úrovni prototypu a ta již nebude součástí každé instance. To ovšem neznamená, že nebude dosažitelná. Při vyhodnocování JavaScript hledá metodu nejprve v příslušném objektu, pakliže ji nenajde, jde o úroveň výše - do prototypu konstruktoru. Samozřejmě je vhodné sdílení pouze takových datových složek, které jsou neměnné pro všechny instance. To znamená především metody a konstanty. Jak by vypadal upravený zápis předchozího příkladu můžete vidět níže:

// Definice konstruktoru
function Auto(znacka, spz) {
  this.znacka = znacka;
  this.spz = spz;
}
Auto.prototype.vypisZnacku = function () {
  alert(this.znacka);
};


Systém dědičnosti nadřazených a podřazených tříd sice v JS neexistuje, ale pomocí prototypů ji lze úspěšně simulovat. Celý princip dědění spočívá v tvorbě nových prototypů. Máme-li třídu VesmirnyObjekt, třídu Planeta podřídíme tím, že přiřadíme konstruktoru planeta jako prototyp objekt VesmirnyObjekt:

function VesmirnyObjekt(soustava) { 
  this.soustava = soustava || "Sluneční";
} 
function Planeta(soustava, jmeno, pocetMesicu) {
  this.parent(soustava); // Zde zavoláme konstruktor rodiče a předáme mu soustavu
  this.jmeno = jmeno;
  this.pocetMesicu = pocetMesicu || 0;
}
// Podporováno od ES 5, tuto funkci je možné dodefinovat (ukázka např. na MDN):
Planeta.prototype = Object.create(VesmirnyObjekt.prototype);
// Je dobrým zvykem, aby vlastnost constructor odkazovala na správnou funkci (Object.create tuto vlastnost přepsala):
Planeta.prototype.constructor = Planeta;
// A nakonec přiřadíme do prototypu odkaz na rodiče:
Planeta.prototype.parent = VesmirnyObjekt;
 
// Vytvoříme novou instanci planety:
var planeta = new Planeta("Alfa Centauri", "Terra Nova", 2);
alert(planeta.soustava);
alert(planeta.jmeno);
alert(planeta.pocetMesicu);


Výjimky (Exceptions)[editovat | editovat zdroj]

Rysem společným s objektově orientovanými jazyky jsou také výjimky. Jedná se o mechanismus zachytávání stavů vyvolaných chybným kódem, například přístupem k neexistující metodě. Tyto chyby lze zachytávat pomocí klíčových slov try, catch a volitelně finally. Na rozdíl od jiných jazyků však výjimka může být jakéhokoli typu, tzn. můžeme vyvolat jako výjimku i řetězec nebo číslo:

function Person(name) {
  if (!name) {
    throw "You have to define the person's name!";
  }
  this.name = name;
}
 
try {
  var person = new Person();
}
catch (ex) {
  alert(typeof ex); // Bude string
  alert(ex); // Vypíše obsah hlášky
}

Je však dobrým zvykem vyvolávat výjimky s typem Error či podobnými.

Rozšíření asm.js[editovat | editovat zdroj]

Asm.js je podmnožina programovacího jazyka JavaScript navržená Mozillou[2], která je určena pro výrazné zrychlení běhu javascriptových programů (podobně jako technologie NaCl a jazyk Dart od Google), zejména původně napsaných pro jinou platformu, v současné době jde hlavně o hry z oblasti PC[3], typicky napsané v jazyce C nebo C++.

Prohlížeče, které tuto podmnožinu JavaScriptu podporují, jsou v současné době, Mozilla Firefox, Google Chrome a Opera.[4][5]

Reference[editovat | editovat zdroj]

  1. New in JavaScript 1.8.5 | Mozilla Developer Network [online]. Developer.mozilla.org, rev. 28-5-2013, [cit. 2014-03-22]. Dostupné online.  
  2. http://asmjs.org/ Homepage (anglicky)
  3. http://www.cnews.cz/epic-games-ve-spolupraci-s-mozillou-v-prohlizeci-zprovoznil-unreal-engine-4 Epic Games ve spolupráci s Mozillou v prohlížeči zprovoznil Unreal Engine 4 (česky)
  4. https://blog.mozilla.org/futurereleases/2013/11/26/chrome-and-opera-optimize-for-mozilla-pioneered-asm-js/ Chrome and Opera Optimize for Mozilla-Pioneered Asm.js (anglicky)
  5. http://www.linuxexpres.cz/novinky/asm-js-zrychluje Asm.js zrychluje (česky)

Externí odkazy[editovat | editovat zdroj]