如何检查两个对象在Actionscript中是否属于同一类型?

如何检查两个对象在Actionscript中是否属于同一类型?

问题描述:

我想这样做在的ActionScript:如何检查两个对象在Actionscript中是否属于同一类型?

typeof(control1) != typeof(control2) 

测试如果两个对象是同一类型的。这将在C#中工作得很好,但在Actionscript中它没有。实际上,它返回'object'两个typeof()表达式,因为这就是Actionscript的工作方式。

我似乎无法通过查看调试器或在Actionscript中描述typeof()的页面找到替代方法。

有没有办法获得实际的运行时类型?

最好的办法是使用flash.utils.getQualifiedClassName()。另外,您可以使用flash.utils.describeType()来获取更多关于该类的XML文档。

+0

你会认为这将是默认行为,但动作知道...更好? – 2011-09-02 07:40:46

+0

我相信`getQualifiedClassName`比`is`运算符慢。但是,它也允许与字符串比较,而不是类,这可能有助于避免编译不使用的类(但可能仍然会检查为对象类型)。 – ericsoco 2012-03-23 22:12:15

你会想要使用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

值得一提的是,如果你想在没有标记为动态的类上使用它,你必须首先将实例转换为对象。对象(myA).constructor – Clintm 2016-04-20 21:53:46

如果你想占继承,那么你可能想尝试这样的:

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

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 

这将为内置类的工作,和类自己创建的。 的动作2相当于运营商是实例

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

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

更一般地,如果你想测试对象A是对象B

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

... 

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

的亚型有没有办法让实际运行时类型?

是的。

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

一些其他的答案已经参考.constructor,但你不能总是直接在ActionScript 3访问.constructor。它只能在dynamic类上访问,大多数类不是。尝试在普通类上使用它会在默认设置下导致编译时错误。

但是,因为每个类继承Object,即dynamic,我们可以通过将实例强制转换为Object来查找它们的.constructor属性。

因此,如果我们不感兴趣的子类,我们可以确认两个实例通过简单地评估这是完全一样的类:

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

我从后“Get the class used to create an object instance in AS3”由Josh Tynjala得知此。


也为我过了更简单的替代方案就是:

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

运行时是完全能够给你.constructor,它只是编译器,如果你使用的语法抱怨。使用["constructor"]应该产生相同的字节码,但是编译器不够聪明,无法阻止你。

我收录了第二个,因为它除了我目前的Flash环境以外没有经过任何测试,而有几位用户说过上述方法适用于他们。