Подтвердить что ты не робот

Как проверить, имеют ли два объекта одного типа в ActionScript?

Я хочу сделать это в ActionScript:

typeof(control1) != typeof(control2)

проверить, являются ли два объекта одного типа. Это будет очень хорошо работать на С#, но в ActionScript это не так. На самом деле он возвращает 'object' для обоих выражений typeof(), потому что так работает ActionScript.

Я не мог найти альтернативу, посмотрев в отладчике или на страницах, описывающих typeof() в ActionScript.

Есть ли способ получить фактический тип времени выполнения?

4b9b3361

Ответ 1

Лучший способ - использовать flash.utils.getQualifiedClassName(). Кроме того, вы можете использовать flash.utils.describeType() для получения документа XML, который описывает больше о классе.

Ответ 2

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 эквивалент оператора экземпляр.

Ответ 3

Вы хотите использовать 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
}

Ответ 4

Есть ли способ получить фактический тип времени выполнения?

Да.

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, в то время как несколько пользователей заявили, что описанный выше метод работает для них.

Ответ 5

Если вы хотите учесть наследование, вы можете попробовать что-то вроде этого:

if (objectA is objectB.constructor || objectB is objectA.constructor)
{
    // ObjectA inherits from ObjectB or vice versa
}

Ответ 6

Object obj = new Object();
Object o = new Object();

if(o.getClass().getName().endsWith(obj.getClass().getName())){
    return true;    
}else{
        return false;
}

Ответ 7

В общем случае, если вы хотите проверить, является ли objectA подтипом объекта B

import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;

...

if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
    ...
}