2008-11-22 3 views
21

Я хочу сделать это в Actionscript:Как проверить, являются ли два объекта одного типа в ActionScript?

typeof(control1) != typeof(control2) 

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

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

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

ответ

19

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

+0

Вы думаете, что это будет поведение по умолчанию, но ActionScript знал ... лучше? – 2011-09-02 07:40:46

+0

Я верю `getQualifiedClassName` медленнее, чем оператор` is`. однако он также позволяет сравнивать со строками, а не с классами, что может быть полезно для избежания компиляции классов, которые вы не используете (но все еще можно проверить как типы объектов). – ericsoco 2012-03-23 22:12:15

4

Вы захотите использовать Object.prototype.constructor.

Из documentation:

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

public function checkType():void { 
    trace(prototype.constructor, prototype.constructor == Player); 
    // shows [class Player] true 
} 
+1

Следует отметить, что если вы хотите использовать это в классе, который не помечен как динамический, вы должны сначала перенести экземпляр на объект. Object (myA) .constructor – Clintm 2016-04-20 21:53:46

1

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

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

Actionscript 3 имеет является оператор, который может быть использован для сравнения объектов. Рассмотрим следующий код:

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 

Это будет работать для встроенных классов и классов, которые вы создали сами. Actioncript 2 эквивалент - Оператор: instanceof.

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

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

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

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

... 

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

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

Да.

var actualRuntimeType:Class = Object(yourInstance).constructor; 

Некоторые другие ответы уже относятся к .constructor, но вы не всегда можете получить быстрый доступ к .constructor в ActionScript 3.Доступно только на классах dynamic, которых большинство классов нет. Попытка использовать его в обычном классе приведет к ошибке времени компиляции по умолчанию.

Однако, поскольку каждый класс наследует от Object, который dynamic, мы можем искать их .constructor собственности только путем литья экземпляра Object.

Поэтому, если мы не заинтересованы в подклассах, мы можем подтвердить, что два экземпляра имеют точно такой же класса, просто оценивая это:

Object(instanceA).constructor === Object(instanceB).constructor; 

Я узнал об этом от должности «Get the class used to create an object instance in AS3» Джош Tynjala ,


еще проще вариант, который также работает для меня это просто:

var actualRuntimeType:Class = yourInstance["constructor"]; 

Среда вполне способна дать вам .constructor, это просто, что компилятор жалуется, если вы используете этот синтаксис. Использование ["constructor"] должно производить один и тот же байт-код, но компилятор недостаточно умен, чтобы остановить вас.

Я включил этот второй, потому что он не был протестирован нигде, кроме моей текущей среды Flash, тогда как несколько пользователей заявили, что описанный выше метод работает для них.

Смежные вопросы