Proměnné, pole a generický objekt
Obsah
Ve Flashi se proměnná neuvozuje žádným symbolem (jako je třeba $ v PHP).
Pokud napíšete nečíselný výraz bez uvozovek, je chápán jako proměnná. Název proměnné nesmí začínat číslem a nesmí obsahovat nepovolené znaky.
Deklarace lokální a globální proměnné
Lokální proměnná (variable)
Existuje jen ve svém bloku kódu (mezi složenými závorkami) - například uvnitř funkce nebo snímku případně objektu. Lokální proměnná není přístupná z vnějšku - po vykonání procesů v místě její existence je uvolněna z paměti.
var pozdrav = "ahoj";
Globální proměnná - vlastnost (property) aktuálního objektu
Funguje podobně jako lokální proměnná, ale jejím definováním vytvoříte vlastnost aktuálního objektu (v animačním prostředí Flashe je to nejčastěji MovieClip).
Po vykonání procesů v místě definice zůstává vlastnost dostupná, a to i z vnějšku, dokud je dostupný i objekt, který ji obsahuje.
this.pozdrav = "ahoj"; // identifikátor "this" je možné vynechat. pozdrav = "ahoj";
Všimněte si, že vlastnost se nedefinuje klíčovým slovem var.
Nechápete? Tak to zatím nechte koni, ten má větší hlavu. Jinak vizte úvod do objektů.
Obsah proměnné
Obsah proměnné nebo vlastnosti může mít více forem - takzvaných datových typů.
Jak se dozvíte později, datový typ reprezentuje typ objektu, který je v proměnné uložen.
Základní (primitivní) datové typy
| String | Textový řetězec |
|---|---|
| Number | Číslo |
| Boolean | Logická hodnota, true nebo false |
Primitivní typy se vyznačují tím, že jdou deklarovat primitivní syntaxí (tzv. literal) - to jest není nutné používat new DatovyTyp()
Tato syntaxe se samozřejmě u jednotlivých typů liší, je důležité to nepoplést, protože nesprávný datový typ může vyústit v neočekávané výsledky.
var text = "Lorem Ipsum"; // text uzavíráme do uvozovek var cislice = "007"; // i číslice mohou být chápány jako text var take_text = 'Dolor sit amet'; // apostrofy jsou ekvivalentní uvozovkám var cislo = 155; // čísla jsou napsána přímo var podil = -0.5; // desetinný separátor je vždy tečka var exponent = 155e6; // exponenciální tvar, 155 milionů var hexa = 0xff; // 255 hexadecimálně var logicke = false; // bez uvozovek
Proměnná s vymezeným datovým typem
Od AS2.0 je možné, při deklaraci proměnné, určit povolený datový typ.
var cislo:Number = 155; cislo = 'text';
Compiler Error:
Type mismatch in assignment statement: found String where Number is required.
Vidíte, že pokud se do vymezené číselné proměnné pokusíme uložit text, kompiler ohlásí chybu.
Je dobrým zvykem omezovat typy proměnných. Mírně to šetří výpočetní výkon prostředí a hlavně nervy při ladění - v případě, že se vám totiž dostane do proměnné typ, který tam nečekáte, kompiler vás hned upozorní, že strkáte kostičku do kulatého otvoru.
Nelze omezovat datové typy globálních proměnných (vlastností objektů) za běhu programu (run-time).
Použití proměnných
Proměnné a vlastnosti je možno použít prakticky kdekoliv místo samotné hodnoty.
var snimek = 38; GotoAndPlay(snimek); // animace přejde na snímek 38
Všimněte si prosím, že klíčové slovo var, případně datový typ proměnné, slouží jen k deklaraci, dál už se neuvádí.
Adresování vlastností
Pokud přistupujeme ke globálním proměnným (vlastnostem) z vnějšku, je nutné specifikovat jejich umístění.
trace(hlavniRamecek.TlacitkoOdeslat.popisek); // Odeslat
Zde vidíte, že je hledána vlastnost popisek (pravděpodobně) MovieClipu TlacitkoOdeslat, který je uvnitř MC hlavniRamecek.
Zde se vám také můžou hodit univerzální identifikátory _parent pro rodičovský objekt a _root pro hlavní scénu. Například:
trace(_parent._parent._parent.pruhlednost);
Priorita
Jak vidíte, tak přestože se proměnné a vlastnosti deklarují jinak, používají se stejně.
Existuje pořadí, kterém jazyk hledá uvedený výraz:
- Argumenty funkce
- Názvy tříd
- Lokální proměnné
- Globální vlastnosti
var neco:String = 'a'; this.neco = 'b'; trace(neco); // a trace(this.neco); // b
Předávání hodnot a předávání referencí
Pokud předáváme základní datové typy proměnné (tedy String, Number nebo Boolean), je předána jen hodnota. Mezi originálem a kopií tak nezůstává žádná vazba:
var jmeno = 'Alois Jirásek'; var kopie = jmeno; trace(kopie); // Alois Jirásek kopie = 'Lorem Ipsum'; trace(kopie); // Lorem Ipsum trace(jmeno); // Alois Jirásek
Všechny ostatní datové typy (například MovieClip) se předávají jako reference. Předáním obsahu se nevytvoří nová instance objektu, ale předá se jen odkaz (ukazatel) na tu existující.
var pole = new Array('a', 'b', 'c'); var kopie = pole; trace(kopie); // a, b, c kopie[0] = 'x'; trace(kopie); // x, b, c trace(pole); // x, b, c
Není možné určit které typy mají být předány referencí a které hodnotou.
Operátor (de)reference v ActionScriptu neexistuje. Pokud chcete předat základní typ jako referenci, musíte jej vložit například do generického objektu nebo pole. A také opačně - duplikovat objekty musíte metodami na to určenými.
Odstranění proměnné nebo vlastnosti
Je dobrým zvykem uvolňovat nepotřebnou paměť. Především pokud máte v proměnné nebo vlastnosti uložený velký obsah.
K tomu slouží příkaz delete.
delete pole;
Datové pole (Array)
Array (pole, matice, chcete-li) je datový objekt sdružující množinu různých prvků. Podrobněji Úvod do objektů nebo Objekty CORE.
Deklarace pole
Přestože bych pole už asi neřadil mezi primitivní datové typy, má ještě také primitivní definiční syntaxi.
var pole:Array = ["a", "b", "c", 15, "ahoj"];Samozřejmě jej lze vytvořit také jako instanci kteréhokoliv jiného objektu. Tedy pomocí klíčového slova
new a konstruktoru Array.
var pole:Array = new Array("a", "b", "c", 15, "ahoj");
Zde jsme (v obou případech) vytvořili proměnnou pole, které obsahuje objekt Array s pěti položkami - konkrétně čtyřmi řetězci (String) a jedním číslem (Number).
Přístup k jednotlivým položkám pole
Položky v poli jsou očíslovány, první položka má klíč roven nule.
gotoAndPlay(pole[3]); // Animace by takto přešla na snímek 15
Hodnoty položek v poli jdou samozřejmě i upravovat:
pole[4] = "čau";
Délka pole je dynamická, můžeme tedy psát:
pole[25] = "nazdar";
Zde jsme přeskočili klíče 5 až 24, ty jsou automaticky vytvořeny jako prázdné.
Na tohle pozor při zjišťování délky pole, prázdné klíče jsou započítány taky, délka tohoto pole je nyní 26.
Pole může obsahovat položky s libovolnými datovými typy, klidně i další pole - tak se dají vytvořit vícerozměrná pole (matice).
var matice:Array = [[1,2],[3,4]]; trace(matice[0][1]); // 2
Délka pole
Aktuální délka pole je uložena ve vlastnosti length.
trace(pole.length); // 26
Délka jde i upravit, pole se pak automaticky prodlouží respektive zkrátí.
Asociativní pole (s textovými klíči)
Klíče pole nemusejí být jen číselné, je možné použít i text.
pole['jmeno'] = 'Pavel';
Takové použití pole ale není doporučováno, většina metod pro práci s poli s textovými klíči nepočítá. Také vlastnost length nebude vracet správný počet položek.
Protože pole je samozřejmě také potomkem generického objektu (Object), lze jeho instancím definovat vlastnosti stejně jako generickému objektu. To je právě případ asociativních klíčů - stojí vlastně mimo normální prvky, je to takový hack, se kterým metody pole už nepočítají.
U předchozího příkladu by šla použít i objektová syntaxe: pole.jmeno = 'Pavel'.
Generický objekt (Object)
Také univerzální datový objekt, rodič většiny ostatních odvozených objektů. Nejčastěji se používá jako asociativní datová struktura.
Jako objekt může obsahovat kromě vlastností (proměnných) i metody (funkce). Je tak možné vytvořit jednoúčelový skriptový objekt. Jak se vytvářejí vlastní objekty a prototypy je popsáno v úvodu do objektů.
var objekt:Object = {jmeno:'Pavel', icq:123456789};
Všimněte si zápisu inicializace hodnot, od pole se mírně liší.
Stejně jako u pole, i objekt lze inicializovat klasicky konstruktorem.
var objekt:Object = new Object({jmeno:'Pavel', icq:123456789}); trace(objekt.jmeno); // Pavel
Alternativní přístup k potomkům
K potomkům objektu přistupujeme operátorem tečka. Stejně tak ale můžeme použít hranaté závorky:
trace(objekt['jmeno']); // Pavel
Je to ideální v případě, že je třeba jméno potomka sestavit dynamicky bez použití funkce eval. V AS3 už je to jediná možnost, protože zde už eval neexistuje.
Vlastní metody generického objektu
Jak jsem zmínil, obsahem objektu nemusí být jen vlastnosti, je možné připojit i metody (funkce objektu).
objekt.pozdrav = function(){ trace('Ahoj! Tvoje jméno je '+this.jmeno+'.'); } objekt.pozdrav(); // Ahoj! Tvoje jméno je Pavel.
Podrobněji v kapitole funkce.