Как проверить, имеют ли два объекта одного типа в 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;
}