Как проверить, есть ли два объекта одного типа в Actionscript? - PullRequest
22 голосов
/ 22 ноября 2008

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

typeof(control1) != typeof(control2)

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

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

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

Ответы [ 7 ]

19 голосов
/ 24 ноября 2008

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

17 голосов
/ 11 апреля 2009

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 .

4 голосов
/ 15 февраля 2013

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

Да.

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

4 голосов
/ 22 ноября 2008

Вы захотите использовать 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
}
1 голос
/ 19 января 2009

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

if (objectA is objectB.constructor || objectB is objectA.constructor)
{
    // ObjectA inherits from ObjectB or vice versa
}
0 голосов
/ 26 мая 2009

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

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

...

if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
    ...
}
0 голосов
/ 15 апреля 2009
Object obj = new Object();
Object o = new Object();

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