Strona wykorzystuje ciasteczka by usprawnić komfort z jej korzystania. Korzystając ze strony akceptujesz naszą Politykę Ciasteczek. X

Precyzyjne porównanie do typu klasy bez wykorzystywania 'is' i 'instanceof'

W ActionScript2 i 3 istnieje możliwość sprawdzenia czy dany obiekt należy do pewnej klasy - w AS2 jest to słowo instanceof a w AS3 is i oba spełniają swoja zadanie całkiem nieźle, jednak należy pamiętać, że oba zwrócą 'true' nawet jeśli docelowy obiekt nie jest dokładnie z tej samej klasy, tylko ją rozszerza. Innymi słowy porównanie obiektu MovieClip do Sprite zwróci 'true':
var mc:MovieClip = new MovieClip();
trace(mc is Sprite); //true
Tak więc co zrobić gdy chcemy sprawdzić, że wybrany obiekt faktycznie należy do docelowej klasy i nic po za tym? Rozwiązania są dwa:
1. Funkcja getQualifiedClassName.
Czyli najprostsze podejście - wyciągamy nazwę klasy w postaci String i porównujemy ją do nazwy której szukamy.
var mc:MovieClip = new MovieClip();
trace(getQualifiedClassName(mc) == "MovieClip"); //true
trace(getQualifiedClassName(mc) == "Sprite"); //false
2. Porównanie konstruktorów.
To już temat nieco bardziej zaawansowany, a do tego możliwy tylko w AS3. Nie jest to do końca jasno napisane, ale każdy obiekt w ActionScript3 ma pole o nazwie 'constructor' zawierające odniesienie do konstruktora użytego przy tworzeniu obiektu, a ponieważ w AS konstruktor w każdej klasie może być tylko jeden wystarczy je porównać:
var mc:MovieClip = new MovieClip();
var con:Object = MovieClip.prototype.constructor;
trace(mc.constructor == con); //true
Przy czym pamiętać tutaj należy o kilku rzeczach:
- ponieważ 'prototype' i 'constructor' są przydzielone dynamicznie ich czas dostępu będzie wolniejszy niż ten z wykorzystaniem funkcji getQualifiedClassName.
- aczkolwiek w odpowiednio dużej pętli, zrzucając uprzednio konstruktor do lokalnej zmiennej, czas wykonania może być nawet o połowę szybszy.
- mc.constructor w FlashDevelop (ale nie Flash Professional) najprawdopodobniej wyrzuci błąd, który można obejść rzutując mc do klasy Object:
var con:Object = MovieClip.prototype.constructor;
trace((mc as Object).constructor == con); //true
Niestety, rzutowanie spowolni czas wykonania o jakieś 10%.

Imię:
Komentarz:
Potwierdz kod z obrazka:confirm image