22

我想在 Actionscript 中执行此操作:

typeof(control1) != typeof(control2)

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

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

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

4

7 回答 7

19

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

于 2008-11-24T18:42:39.727 回答
17

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

这适用于内置类和您自己创建的类。is运算符的 actionscript 2 等效项是instanceof

于 2009-04-10T22:06:06.387 回答
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 的类中尝试了它。由于原型属性是静态的,你不能使用“this”来调用它,但你可以跳过范围标识符并且它可以工作:

public function checkType():void {
    trace(prototype.constructor, prototype.constructor == Player);
    // shows [class Player] true
}
于 2008-11-22T04:45:22.397 回答
4

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

是的。

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

其他一些答案已经提到.constructor,但您不能总是直接.constructor在 ActionScript 3 中访问。它只能在dynamic类上访问,而大多数类不是。尝试在常规类上使用它会在默认设置下导致编译时错误。

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

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

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

我从Josh Tynjala的文章“获取用于在 AS3 中创建对象实例的类”中了解到这一点。


一个更简单的替代方案也适用于我:

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

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

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

于 2013-02-14T21:46:47.970 回答
1

如果你想考虑继承,那么你可能想尝试这样的事情:

if (objectA is objectB.constructor || objectB is objectA.constructor)
{
    // ObjectA inherits from ObjectB or vice versa
}
于 2009-01-19T13:26:46.713 回答
0
Object obj = new Object();
Object o = new Object();

if(o.getClass().getName().endsWith(obj.getClass().getName())){
    return true;    
}else{
        return false;
}
于 2009-04-15T07:03:43.160 回答
0

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

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

...

if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
    ...
}
于 2009-05-26T01:13:08.597 回答