我想在Actionscript中执行此操作:
typeof(control1) != typeof(control2)
测试两个对象是否属于同一类型。这在C#中可以正常工作,但在Actionscript中它没有。实际上,它会为'object'
个表达式返回typeof()
,因为这就是Actionscript的工作方式。
我似乎无法通过查看调试器或在Actionscript中描述typeof()
的页面找到替代方案。
有没有办法获得实际的运行时类型?
答案 0 :(得分:19)
最好的方法是使用flash.utils.getQualifiedClassName()
。此外,您可以使用flash.utils.describeType()
来获取有关该类的更多描述的XML文档。
答案 1 :(得分: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
这适用于内置类和您自己创建的类。与 运算符等效的actionscript 2是 instanceof 。
答案 2 :(得分:4)
您将要使用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
}
答案 3 :(得分:4)
有没有办法获得实际的运行时类型?
是
var actualRuntimeType:Class = Object(yourInstance).constructor;
其他一些答案已经引用.constructor
,但您无法始终直接访问ActionScript 3中的.constructor
。它只能在dynamic
类上访问,而大多数类都不能访问。尝试在常规类上使用它将导致默认设置下的编译时错误。
但是,因为每个类都继承自Object
dynamic
,所以我们只需将实例强制转换为.constructor
即可查找其Object
属性。
因此,如果我们对子类不感兴趣,我们可以通过简单地评估它来确认两个实例是完全相同的类:
Object(instanceA).constructor === Object(instanceB).constructor;
我从Josh Tynjala的帖子“Get the class used to create an object instance in AS3”中了解到这一点。
对我来说更简单的替代方案就是:
var actualRuntimeType:Class = yourInstance["constructor"];
运行时完全能够为您提供.constructor
,只是如果您使用该语法,编译器会抱怨。使用["constructor"]
应该生成相同的字节码,但编译器不够聪明,不能阻止你。
我包含了第二个,因为它除了我当前的Flash环境之外没有经过任何测试,而有几个用户说过上述方法适用于它们。
答案 4 :(得分:1)
如果你想考虑继承,那么你可能想尝试这样的事情:
if (objectA is objectB.constructor || objectB is objectA.constructor)
{
// ObjectA inherits from ObjectB or vice versa
}
答案 5 :(得分:0)
Object obj = new Object();
Object o = new Object();
if(o.getClass().getName().endsWith(obj.getClass().getName())){
return true;
}else{
return false;
}
答案 6 :(得分:0)
更一般地说,如果你想测试对象是否是对象的子类型