Ответ 1
Лучший способ - использовать flash.utils.getQualifiedClassName()
. Кроме того, вы можете использовать flash.utils.describeType()
для получения документа XML, который описывает больше о классе.
Я хочу сделать это в ActionScript:
typeof(control1) != typeof(control2)
проверить, являются ли два объекта одного типа. Это будет очень хорошо работать на С#, но в ActionScript это не так. На самом деле он возвращает 'object'
для обоих выражений typeof()
, потому что так работает ActionScript.
Я не мог найти альтернативу, посмотрев в отладчике или на страницах, описывающих typeof()
в ActionScript.
Есть ли способ получить фактический тип времени выполнения?
Лучший способ - использовать flash.utils.getQualifiedClassName()
. Кроме того, вы можете использовать flash.utils.describeType()
для получения документа XML, который описывает больше о классе.
ActionScript 3 имеет оператор is, который можно использовать для сравнения объектов. Рассмотрим следующий код:
var mySprite:Sprite = new Sprite();
var myMovie:MovieClip = new MovieClip();
trace(mySprite is Sprite);
trace(myMovie is MovieClip);
trace(mySprite is MovieClip);
trace(myMovie is Sprite);
Что будет производить следующий вывод:
true
true
false
false
Это будет работать для встроенных классов и классов, которые вы создаете сами. ActionScript 2 эквивалент оператора экземпляр.
Вы хотите использовать Object.prototype.constructor.
Из документация:
dynamic class A {}
trace(A.prototype.constructor); // [class A]
trace(A.prototype.constructor == A); // true
var myA:A = new A();
trace(myA.constructor == A); // true
(Удобно, это также, как проверить типы в javascript, и это то, что изначально привело меня к этому в документах)
Итак, чтобы проверить это, прежде чем я разместил здесь, я попробовал его в приложении, которое у меня есть, в классе под названием Player. Поскольку свойство prototype является статическим, вы не можете вызвать его с помощью "this", но вы можете просто пропустить идентификатор области видимости, и он работает:
public function checkType():void {
trace(prototype.constructor, prototype.constructor == Player);
// shows [class Player] true
}
Есть ли способ получить фактический тип времени выполнения?
Да.
var actualRuntimeType:Class = Object(yourInstance).constructor;
Некоторые другие ответы уже относятся к .constructor
, но вы не всегда можете напрямую обращаться к .constructor
в ActionScript 3. Доступно только в классах dynamic
, что большинство классов нет. Попытка использовать его в обычном классе приведет к ошибке времени компиляции по умолчанию.
Однако, поскольку каждый класс наследует от Object
, который является dynamic
, мы можем найти их свойство .constructor
, просто наведя экземпляр в Object
.
Поэтому, если нас не интересуют подклассы, мы можем подтвердить, что два экземпляра имеют один и тот же класс, просто оценивая это:
Object(instanceA).constructor === Object(instanceB).constructor;
Я узнал об этом из сообщения " Получить класс, используемый для создания экземпляра объекта в AS3" Джошем Тиньялой.
Еще более простая альтернатива, которая также работает для меня, - это просто:
var actualRuntimeType:Class = yourInstance["constructor"];
Время выполнения полностью способно предоставить вам .constructor
, это просто то, что компилятор жалуется, если вы используете этот синтаксис. Использование ["constructor"]
должно производить один и тот же байт-код, но компилятор недостаточно умен, чтобы остановить вас.
Я включил этот второй, потому что он не тестировался нигде, кроме моей текущей среды Flash, в то время как несколько пользователей заявили, что описанный выше метод работает для них.
Если вы хотите учесть наследование, вы можете попробовать что-то вроде этого:
if (objectA is objectB.constructor || objectB is objectA.constructor)
{
// ObjectA inherits from ObjectB or vice versa
}
Object obj = new Object();
Object o = new Object();
if(o.getClass().getName().endsWith(obj.getClass().getName())){
return true;
}else{
return false;
}
В общем случае, если вы хотите проверить, является ли objectA подтипом объекта B
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
...
if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
...
}