Как проверить, имеют ли два объекта одного типа в Actionscript?
Я хочу сделать это в Actionscript:
typeof(control1) != typeof(control2)
чтобы проверить, являются ли два объекта одного типа. Это будет отлично работать в C#, но в Actionscript это не так. На самом деле он возвращает 'object'
для typeof()
выражения, потому что так работает Actionscript.
Я не мог найти альтернативу, посмотрев в отладчике или на страницах, которые описывают typeof()
в Actionscript.
есть ли способ получить фактический тип времени выполнения?
7 ответов
лучший способ-использовать 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 эквивалент is оператор instanceof.
вы захотите использовать объект.прототип.конструктор.
С документация:
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 " by Josh Tynjala.
еще более простая альтернатива, которая также работает для меня просто:
var actualRuntimeType:Class = yourInstance["constructor"];
среда выполнения полностью способна дать вам .constructor
, просто компилятор жалуется, если вы используете этот синтаксис. Используя ["constructor"]
должен производить тот же байт-код, но компилятор не достаточно умен, чтобы остановить вас.
я включил этот второй, потому что он не был протестирован нигде, кроме моей текущей среды Flash, в то время как несколько пользователей сказали, что метод, описанный выше, работает для них.
Если вы хотите учитывать наследование, то вы можете попробовать что-то вроде этого:
if (objectA is objectB.constructor || objectB is objectA.constructor)
{
// ObjectA inherits from ObjectB or vice versa
}
в более общем плане, если вы хотите проверить, является ли objectA подтипом objectB
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
...
if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
...
}
Object obj = new Object();
Object o = new Object();
if(o.getClass().getName().endsWith(obj.getClass().getName())){
return true;
}else{
return false;
}