constructor
プロパティを使用してインスタンスの独自のクラスへの参照を取得できますが、先祖クラスにアクセスするには、describeType
とgetDefinitionByName
を使用する必要があります。これらは、強力な、しかし高価である - ので、あなたがいない乱用、このことを確認してください:クラス自体が財産を持っているし、各スーパータイプを反復場合
function callStaticAncestorProperty(instance:Object, staticProperty:String):* {
var type:XML = describeType(instance);
var ret:* = instance.constructor[staticProperty];
for each(var extend:XML in type.extendsClass)
ret = ret ? ret : getStaticPropertyOrUndefined(extend, staticProperty);
return ret;
}
function getStaticPropertyOrUndefined(extend:XML, staticProperty:String):* {
var clazz:Class = getDefinitionByName([email protected]().replace("::", ".")) as Class;
return clazz[staticProperty] ? clazz[staticProperty] : undefined;
}
これをチェックします。見つかる最初の値が返されることに注意してください。つまり、サブクラスとスーパークラスの両方にこのプロパティがある場合、サブクラスのプロパティが返されます。
編集
私はちょうどあなたがメソッド呼び出しではなく、性質について尋ねた実現。これはかなり同じように動作します:
function callStaticAncestorMethod(instance:Object, staticMethod:String):void {
var type:XML = describeType(instance);
var method:Function = instance.constructor[staticMethod];
for each(var extend:XML in type.extendsClass)
method = method ? method : getStaticMethodOrUndefined(extend, staticMethod);
if (method) method();
}
function getStaticMethodOrUndefined(extend:XML, staticMethod:String):Function {
var clazz:Class = getDefinitionByName([email protected]().replace("::", ".")) as Class;
return clazz[staticMethod] ? clazz[staticMethod] : undefined;
}
秘密の握手ました。コール() –