Jak przejść z instancji klasy do obiektu klasy w ActionScript 3?

Jak uzyskać instancję klasy actionscript Class z instancji tej klasy?

W Pythonie byłoby to x.__class__; w Javie, x.getClass();.

Zdaję sobie sprawę, że istnieją po to straszne hacki , ale szukam wbudowanego zaplecza językowego, a przynajmniej procedury bibliotecznej zbudowanej na czymś wiarygodnym.

Author: Glyph, 2008-10-15

3 answers

Można go uzyskać poprzez właściwość 'constructor' klasy obiektu bazowego. tj.:

var myClass:Class = Object(myObj).constructor;
 69
Author: Gerald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-15 08:19:41

Nie mogłeś tego zrobić?

var s:Sprite = new flash.display.Sprite();

var className:String = flash.utils.getQualifiedClassName( s );
var myClass:Class = flash.utils.getDefinitionByName( className ) as Class;

trace(className ); // flash.display::Sprite
trace(myClass); // [class Sprite]

var s2 = new myClass();
trace(s2); // [object Sprite]

Nie znam sposobu, aby uniknąć potknięcia się przez Sznurek, ale powinno działać wystarczająco dobrze.

 14
Author: fenomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-15 08:18:02

Przyjęta (i obecnie najpopularniejsza odpowiedź) ma pewne wady. Odpowiedź służy temu konkretnemu Przypadkowi użycia, ale komentarze rozszerzyły odpowiedź na pozornie ogólne rozwiązanie.

Ale w pewnych przypadkach nie jest to rozwiązanie bezpieczne dla typu i nie dotyczy wszystkich możliwych obiektów. Pomysł, że XML nie jest obsługiwany, został wystarczająco dobrze zaadresowany tutaj i gdzie indziej, ale pomysł bezpieczny dla typów nie.

Przyjęte założenie jest takie, że jest to obiekt klasy utworzony przez programista. Oto kilka testów, które skonfigurowałem (jest to w trybie ścisłym, ale test lokalny). Zwróć uwagę na wyniki testu int:

var sprite:Sprite = new Sprite();
var xml:XML = new XML();
var testInt:int = 2;
var testClass:TestClass = new TestClass();
var testAnon:Object = {};

trace("classname 1 = " + getQualifiedClassName(sprite));
trace("myclass 1 = " + getDefinitionByName(getQualifiedClassName(sprite)));
trace("constructor a 1 = " + Object(sprite).constructor);
trace("constructor a 1 = " + (Object(sprite).constructor as Class));
trace("constructor b 1 = " + sprite["constructor"]);
trace("constructor b 1 = " + (sprite["constructor"] as Class));
trace("...");
trace("classname 2 = " + getQualifiedClassName(xml));
trace("myclass 2 = " + getDefinitionByName(getQualifiedClassName(xml)));
trace("constructor a 2 = " + Object(xml).constructor);
trace("constructor a 2 = " + (Object(xml).constructor as Class));
trace("constructor b 2 = " + xml["constructor"]);
trace("constructor b 2 = " + (xml["constructor"] as Class));
trace("...");
trace("classname 3 = " + getQualifiedClassName(testInt));
trace("myclass 3 = " + getDefinitionByName(getQualifiedClassName(testInt)));
trace("constructor a 3 = " + Object(testInt).constructor);
trace("constructor a 3 = " + (Object(testInt).constructor as Class));
trace("constructor b 3 = " + testInt["constructor"]);
trace("constructor b 3 = " + (testInt["constructor"] as Class));
trace("...");
trace("classname 4 = " + getQualifiedClassName(testClass));
trace("myclass 4 = " + getDefinitionByName(getQualifiedClassName(testClass)));
trace("constructor a 4 = " + Object(testClass).constructor);
trace("constructor a 4 = " + (Object(testClass).constructor as Class));
trace("constructor b 4 = " + testClass["constructor"]);
trace("constructor b 4 = " + (testClass["constructor"] as Class));
trace("...");
trace("classname 5 = " + getQualifiedClassName(testAnon));
trace("myclass 5 = " + getDefinitionByName(getQualifiedClassName(testAnon)));
trace("constructor a 5 = " + Object(testAnon).constructor);
trace("constructor a 5 = " + (Object(testAnon).constructor as Class));
trace("constructor b 5 = " + testAnon["constructor"]);
trace("constructor b 5 = " + (testAnon["constructor"] as Class));
trace("...");

Z TestClass zdefiniowanym jako:

package
{
    public class TestClass
    {
    }
}

Wyniki:

classname 1 = flash.display::Sprite
myclass 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor b 1 = [class Sprite]
constructor b 1 = [class Sprite]
...
classname 2 = XML
myclass 2 = [class XML]
constructor a 2 = 
constructor a 2 = null
constructor b 2 = 
constructor b 2 = null
...
classname 3 = int
myclass 3 = [class int]
constructor a 3 = [class Number]
constructor a 3 = [class Number]
constructor b 3 = [class Number]
constructor b 3 = [class Number]
...
classname 4 = src::TestClass
myclass 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor b 4 = [class TestClass]
constructor b 4 = [class TestClass]
...
classname 5 = Object
myclass 5 = [class Object]
constructor a 5 = [class Object]
constructor a 5 = [class Object]
constructor b 5 = [class Object]
constructor b 5 = [class Object]
...

Poza wszelkimi obecnymi testami, istnieje dość dobry powód, aby używać getDefinitionByName zamiast metod constructor. Metoda getDefinitionByName pozwala:

    Adobe opracowuje wewnętrzne rozwiązania dla (obecnych i przyszłych) problematycznych obszarów]}
  • nie musiałbyś zmieniać kodu dla future Adobe developments
  • nie musisz rozwijać dwóch (lub więcej) oddzielnych metod dynamicznej instancji.

Teraz może być wolniej, ale w przyszłości mogą pojawić się ulepszenia ze strony Adobe, które rozwiązałyby problem prędkości.

(na przykład, kiedyś uint było znacznie wolniejsze w pętlach for niż int, więc wiele kodu konwersji zostało skonfigurowanych tak, aby używać szybszego int. To był dość prosty problem do rozwiązania, więc Adobe go naprawił, a teraz jest wiele kodu, który przeskakuje przez niepotrzebne obręcze, aby osiągnąć przestarzały cel.)

Ponieważ metoda getDefinitionByName działa poprawnie we wszystkich przypadkach, kod powinien być opracowany przy użyciu tej metody, a następnie pracować, aby Adobe naprawić problem z prędkością.

 14
Author: iND,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-05 23:19:16