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