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

如何在Actionscript中检查两个对象是否属于同一类型?,actionscript,typeof,Actionscript,Typeof,我想在Actionscript中执行此操作: typeof(control1) != typeof(control2) 测试两个对象是否属于同一类型。这在C#中可以正常工作,但在Actionscript中却不行。实际上,对于typeof()表达式,它都返回'object',因为Actionscript就是这样工作的 通过查看调试器或Actionscript中描述typeof()的页面,我似乎找不到替代方法 有没有办法获得实际的运行时类型?您需要使用Object.prototype.constr

我想在Actionscript中执行此操作:

typeof(control1) != typeof(control2)
测试两个对象是否属于同一类型。这在C#中可以正常工作,但在Actionscript中却不行。实际上,对于
typeof()
表达式,它都返回
'object'
,因为Actionscript就是这样工作的

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


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

您需要使用Object.prototype.constructor

从:

(很方便,这也是如何在javascript中检查类型,这是我在文档中最初提到的)

所以,在我发布之前,为了验证这一点,我在一个名为Player的类中,在我拥有的应用程序中进行了尝试。由于prototype属性是静态的,您不能使用“this”调用它,但您可以跳过范围标识符,它可以工作:

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

最好的方法是使用
flash.utils.getQualifiedClassName()
。此外,您可以使用
flash.utils.describeType()
获取XML文档,该文档描述了有关该类的更多信息。

如果您想说明继承,那么您可能需要尝试以下方法:

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

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

这将适用于内置类和您自己创建的类。如果要测试objectA是否为objectB的子类型,则与is运算符等价的actionscript 2一般为instanceof

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

if(o.getClass().getName().endsWith(obj.getClass().getName())){
    return true;    
}else{
        return false;
}
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;

...

if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
    ...
}
有没有办法获得实际的运行时类型

var-actualRuntimeType:Class=Object(yourInstance).constructor;
其他一些答案已经提到了
.constructor
,但您不能总是直接访问ActionScript 3中的
.constructor
。它只能在
动态
类上访问,而大多数类都不是。在默认设置下,尝试在常规类上使用它将导致编译时错误

但是,由于每个类都继承自
对象
,即
动态
,因此我们只需将实例强制转换为
对象
,即可查找它们的
构造函数
属性

因此,如果我们对子类不感兴趣,我们可以通过简单地评估以下内容来确认两个实例属于完全相同的类:

Object(instanceA).constructor==Object(instanceB).constructor;
我是从Josh Tynjala的“邮报”上得知这一点的


一个更简单的、对我也有效的选择是:

var actualRuntimeType:Class = yourInstance["constructor"];
运行时完全能够为您提供
.constructor
,只是如果您使用该语法,编译器会抱怨。使用
[“constructor”]
应该生成相同的字节码,但编译器不够聪明,无法阻止您


我之所以包括这第二个,是因为除了我当前的Flash环境之外,它没有在任何地方进行过测试,而一些用户表示上述方法对他们有效。

您可能认为这是默认行为,但actionscript知道。。。更好?我相信
getQualifiedClassName
is
操作符慢。但是,它还允许对字符串而不是类进行比较,这可能有助于避免编译未使用的类(但可能仍在检查对象类型),尽管它不适用于VectorCollection,但值得一提的是,如果您想在未标记为动态的类上使用它,您必须首先将实例强制转换为对象。对象(myA).构造函数
var actualRuntimeType:Class = yourInstance["constructor"];