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

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

typeof(control1) != typeof(control2)

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

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

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


person Simon_Weaver    schedule 22.11.2008    source источник


Ответы (6)


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

person Community    schedule 24.11.2008
comment
Вы могли подумать, что это будет поведение по умолчанию, но ActionScript знал ... лучше? - person Ramon Zarazua B.; 02.09.2011
comment
я считаю, что getQualifiedClassName медленнее, чем оператор is. однако он также позволяет проводить сравнение со строками, а не с классами, что может быть полезно для избежания компиляции классов, которые вы не используете (но все же может проверяться как типы объектов). - person ericsoco; 24.03.2012

В 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.

person Community    schedule 10.04.2009

Вы захотите использовать 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. Поскольку свойство прототипа является статическим, вы не можете вызвать его с помощью «this», но вы можете просто пропустить идентификатор области, и он будет работать:

public function checkType():void {
    trace(prototype.constructor, prototype.constructor == Player);
    // shows [class Player] true
}
person enobrev    schedule 22.11.2008
comment
Стоит упомянуть, что если вы хотите использовать это в классе, который не помечен как динамический, вам нужно сначала привести экземпляр к объекту. Объект (myA) .constructor - person Clintm; 21.04.2016

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

да.

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

person Jeremy    schedule 14.02.2013
comment
Очень изящный трюк, хотя с VectorCollection он не работает. - person Tox; 24.08.2015

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

if (objectA is objectB.constructor || objectB is objectA.constructor)
{
    // ObjectA inherits from ObjectB or vice versa
}
person Richard Szalay    schedule 19.01.2009

В более общем плане, если вы хотите проверить, является ли objectA подтипом objectB

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

...

if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
    ...
}
person verveguy    schedule 26.05.2009