Metody a funkce
Obsah
Pro základní informace o funkcích prosím nahlédněte do funkcí AS2. My se pro tuto chvíli zaměříme na novinky a změny.
Funkce jsou metody
Připomeňme, že Flash je ryze objektové prostředí. Funkce uvnitř objektu se nazývá metoda (toho objektu). Touto logikou dojdeme k závěru, že ve Flashi funkce vlastně neexistují.
Možnou výjimkou by mohla být anonymní funkce. A také skromný zbyteček globálních funkcí prostředí.
To jen pro ujasnění terminologie.
Metoda už nemůže fungovat jako konstruktor
V úvodu do objektů AS2 jsem ukazoval, že je možné za běhu programu vytvořit nový prototyp použitím funkce jako konstruktoru.
function circle(radius){ this.radius = radius; this.getArea = function(){ return Math.PI * Math.pow(this.radius, 2); } } var kruh = new circle(10);
1048: Method cannot be used as a constructor.
Tato technika už není možná. V závislosti na tom také přestala existovat vlastnost objektu _proto_.
Jediný možný způsob tvorby vlastních prototypů tedy zůstává prostřednictvím tříd.
Metody mají přesně stanoven počet argumentů
Ve AS2 jste mohli předávat metodě libovolný počet argumentů, bez ohledu na to, kolik jich měla explicitně vyjmenováno. Nespecifikované argumenty pak byly dostupné skrze objekt arguments.
To nyní nelze.
function vynasob(a, b){ return a * b; } vynasob(5, 10, 20);
1137: Incorrect number of arguments. Expected no more than 2.
Rest operátor
Pokud je třeba vytvořit funkci s proměnlivým počtem argumentů, používá se rest operátor "...".
function prumer(jmeno, ... hodnoceni){ var sum = 0; for each(var i in hodnoceni){ sum += i; } return jmeno+': '+sum/hodnoceni.length; } prumer('Karel',5,3,1,1,2,3); // Karel: 2.5
hodnoceni je obyčejné pole se zbytkem argumentů.
Nepovinné argumenty
Poměrně běžná věc u ostatních jazyků. ActionScript ale odolával dlouho.
function pozdrav(jmeno = 'Inkognito'){ return 'Dobrý den, pane '+jmeno; } pozdrav(); // Dobrý den, pane Inkognito
Předdefinované globální funkce
A pak že nerostou. Je to s podivem. Každá kočičárna už má ve Flashi svůj objekt, tito sirotci ne. Dokonce ani ve smeťáku flash.utils na ně nezbylo místo.
Funkce eval byla zrušena
Funkce eval, vyhodnocující řetězec pro přístup k proměnné, vlastnosti nebo objektu, už nejde použít.
for(var i = 1; i<=5; i++){ eval('panel.button'+i).enabled = false; }
Warning: 1060: Migration issue: The method eval is no longer supported.
Protože je možné přistupovat k potomkům objektů také operátorem [], můžeme použít ekvivalentní postup.
for(var i = 1; i<=5; i++){ panel['button'+i].enabled = false; }
Ostatní zrušené globální funkce
| getProperty | Bez náhrady odstraněna, čehož si asi ještě nikdo nevšimnul. |
|---|---|
| targetPath | Bez náhrady odstraněna. |
| getTimer | Přesunuta do flash.utils. |
| getVersion | Nahrazena flash.system.Capabilities.version. |
Některé nové globální funkce
| encodeURI | Podobná escape, očekává ale celou URI, ze které šetrně zakóduje jen query. |
|---|---|
| encodeURIComponent | Totéž, ale očekávána je jen query část. |
| decodeURI | Reverzní k předchozím. |
| decodeURIComponent |