如何检查两个对象在Actionscript中是否属于同一类型?
我想这样做在的ActionScript:如何检查两个对象在Actionscript中是否属于同一类型?
typeof(control1) != typeof(control2)
测试如果两个对象是同一类型的。这将在C#中工作得很好,但在Actionscript中它没有。实际上,它返回'object'
两个typeof()
表达式,因为这就是Actionscript的工作方式。
我似乎无法通过查看调试器或在Actionscript中描述typeof()
的页面找到替代方法。
有没有办法获得实际的运行时类型?
最好的办法是使用flash.utils.getQualifiedClassName()
。另外,您可以使用flash.utils.describeType()
来获取更多关于该类的XML文档。
你会想要使用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的课程中尝试了它。由于原型属性是静态的,你不能使用“本”,但你可以跳过范围标识符调用它,它的工作原理:
public function checkType():void {
trace(prototype.constructor, prototype.constructor == Player);
// shows [class Player] true
}
值得一提的是,如果你想在没有标记为动态的类上使用它,你必须首先将实例转换为对象。对象(myA).constructor – Clintm 2016-04-20 21:53:46
如果你想占继承,那么你可能想尝试这样的:
if (objectA is objectB.constructor || objectB is objectA.constructor)
{
// ObjectA inherits from ObjectB or vice versa
}
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
这将为内置类的工作,和类自己创建的。 的动作2相当于运营商是实例。
Object obj = new Object();
Object o = new Object();
if(o.getClass().getName().endsWith(obj.getClass().getName())){
return true;
}else{
return false;
}
更一般地,如果你想测试对象A是对象B
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
...
if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
...
}
的亚型有没有办法让实际运行时类型?
是的。
var actualRuntimeType:Class = Object(yourInstance).constructor;
一些其他的答案已经参考.constructor
,但你不能总是直接在ActionScript 3访问.constructor
。它只能在dynamic
类上访问,大多数类不是。尝试在普通类上使用它会在默认设置下导致编译时错误。
但是,因为每个类继承Object
,即dynamic
,我们可以通过将实例强制转换为Object
来查找它们的.constructor
属性。
因此,如果我们不感兴趣的子类,我们可以确认两个实例通过简单地评估这是完全一样的类:
Object(instanceA).constructor === Object(instanceB).constructor;
我从后“Get the class used to create an object instance in AS3”由Josh Tynjala得知此。
也为我过了更简单的替代方案就是:
var actualRuntimeType:Class = yourInstance["constructor"];
运行时是完全能够给你.constructor
,它只是编译器,如果你使用的语法抱怨。使用["constructor"]
应该产生相同的字节码,但是编译器不够聪明,无法阻止你。
我收录了第二个,因为它除了我目前的Flash环境以外没有经过任何测试,而有几位用户说过上述方法适用于他们。
你会认为这将是默认行为,但动作知道...更好? – 2011-09-02 07:40:46
我相信`getQualifiedClassName`比`is`运算符慢。但是,它也允许与字符串比较,而不是类,这可能有助于避免编译不使用的类(但可能仍然会检查为对象类型)。 – ericsoco 2012-03-23 22:12:15