我想检查对象是否有一个 DisplayObject 作为它的祖先之一,如果有,则对其执行一些操作。有什么快速简单的方法来做到这一点?
问问题
322 次
2 回答
3
如果“祖先”是指“超类之一”,那么解决方案很简单:在 ActionScript中,只有当对象的类在其继承链中具有 DisplayObject 时,对象才能具有“作为其祖先之一的 DisplayObject ”,这很容易通过以下方式检查铸件。继承在父类和子类之间创建“IS A”关系,因此子类的实例是父类(以及任何其他远亲)的实例。
var object:* = ....;
if (object is DisplayObject) {
var displayObject:DisplayObject = object as DisplayObject;
// object has DisplayObject class in it's inheritance chain
// do something with object using displayObject reference
}
或者
var object:* = ....;
var displayObject:DisplayObject = object as DisplayObject;
if (displayObject != null) {
// object has DisplayObject class in it's inheritance chain
// do something with object using displayObject reference
}
于 2011-07-03T11:47:47.067 回答
2
由于误解问题而完全重写
编辑比我的第一个建议更快的方法是使用flash.utils.getQualifiedClassName
和flash.utils.getQualifiedSuperclassName
文档中建议的组合来检查每个祖先类的超类。这是一个简单的功能,可以为您做到这一点:
function containsAncestor($obj:*,$className:String):Boolean {
var qn:String = getQualifiedClassName($obj);
while(qn != "Object") {
if(qn == $className) return true;
qn = getQualifiedSuperclassName(getDefinitionByName(qn));
}
return false;
}
//////////////////////////////////
//usage example:
//////////////////////////////////
var mc:MovieClip = new MovieClip();
trace(containsAncestor(mc,"flash.display::DisplayObject")); //true
trace(containsAncestor(mc,"flash.display::BitmapData")); //false
您需要的是 flash.utils 中的describeType函数。这将生成对象的 XML 表示,包括返回到 Object 的祖先类的完整列表。MovieClip 的输出开头如下所示:
<type name="flash.display::MovieClip" base="flash.display::Sprite" isDynamic="true" isFinal="false" isStatic="false">
<extendsClass type="flash.display::Sprite"/>
<extendsClass type="flash.display::DisplayObjectContainer"/>
<extendsClass type="flash.display::InteractiveObject"/>
<extendsClass type="flash.display::DisplayObject"/>
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
因此,您剩下要做的就是循环遍历 extendsClass 节点并检查是否存在DisplayObject
.
于 2011-07-03T11:06:49.127 回答