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

时间:2008-11-22 03:40:27

标签: actionscript typeof

我想在Actionscript中执行此操作:

typeof(control1) != typeof(control2)

测试两个对象是否属于同一类型。这在C#中可以正常工作,但在Actionscript中它没有。实际上,它会为'object'个表达式返回typeof(),因为这就是Actionscript的工作方式。

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

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

7 个答案:

答案 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。

来自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的类中的应用程序中尝试了它。由于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)

更一般地说,如果你想测试对象是否是对象的子类型