オブジェクトの祖先の1つとしてDisplayObjectがあるかどうかを確認し、ある場合はいくつかの操作を実行したいと思います。これを行うための迅速で簡単な方法はありますか?
2 に答える
「祖先」が「スーパークラスの1つ」を意味する場合、解決策は単純です。ActionScriptでは、オブジェクトのクラスの継承チェーンにDisplayObjectが含まれている場合にのみ、オブジェクトは「祖先の1つとしてDisplayObject 」を持つことができます。鋳造。継承は、親クラスと子クラスの間に「ISA」関係を作成するため、子のインスタンスは親(および他の遠い祖先)のインスタンスです。
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
}
質問の誤解による完全な書き直し
編集私の最初の提案よりも速い方法は、ドキュメントで提案されているように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関数です。これにより、Objectに戻る祖先クラスの完全なリストを含むオブジェクトのXML表現が生成されます。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
。