Есть ли способ, чтобы получить фактический тип во время выполнения?
Да.
var actualRuntimeType:Class = Object(yourInstance).constructor;
Некоторые другие ответы уже относятся к .constructor
, но вы не всегда можете получить быстрый доступ к .constructor
в ActionScript 3.Доступно только на классах dynamic
, которых большинство классов нет. Попытка использовать его в обычном классе приведет к ошибке времени компиляции по умолчанию.
Однако, поскольку каждый класс наследует от Object
, который dynamic
, мы можем искать их .constructor
собственности только путем литья экземпляра Object
.
Поэтому, если мы не заинтересованы в подклассах, мы можем подтвердить, что два экземпляра имеют точно такой же класса, просто оценивая это:
Object(instanceA).constructor === Object(instanceB).constructor;
Я узнал об этом от должности «Get the class used to create an object instance in AS3» Джош Tynjala ,
еще проще вариант, который также работает для меня это просто:
var actualRuntimeType:Class = yourInstance["constructor"];
Среда вполне способна дать вам .constructor
, это просто, что компилятор жалуется, если вы используете этот синтаксис. Использование ["constructor"]
должно производить один и тот же байт-код, но компилятор недостаточно умен, чтобы остановить вас.
Я включил этот второй, потому что он не был протестирован нигде, кроме моей текущей среды Flash, тогда как несколько пользователей заявили, что описанный выше метод работает для них.
Вы думаете, что это будет поведение по умолчанию, но ActionScript знал ... лучше? – 2011-09-02 07:40:46
Я верю `getQualifiedClassName` медленнее, чем оператор` is`. однако он также позволяет сравнивать со строками, а не с классами, что может быть полезно для избежания компиляции классов, которые вы не используете (но все еще можно проверить как типы объектов). – ericsoco 2012-03-23 22:12:15