在AS3中拦截类型函数调用的任何方法?

时间:2012-04-20 19:18:17

标签: actionscript-3 proxy decorator

我知道动态添加到动态代理类的函数很容易,但我也希望能够拦截对类型化函数的调用,就像Python中的装饰器一样。以下示例。我喜欢某种方式能够通过'callProperty'来获取'typedFunc',就好像它已经通过'dynFunc',

example

package
{
    import flash.display.Sprite;
    [SWF(width = '400', height = '400')]
    public class Test extends Sprite
    {
        public function Test()
        {
            var t:TypeTest = new TypeTest();
            t.dynFunc = function dynFunc(s:String, i:int):Boolean { return true; };

            t.typedFunc("a", 1);
            t.dynFunc("b", 2);
        }
    }
}
import flash.utils.Proxy;
import flash.utils.flash_proxy;

internal dynamic class TypeTest extends Proxy
{
    private var customs:Object = new Object();
    override flash_proxy function callProperty(name:*, ...parameters):* {
        var retval:* = (this[name] as Function).apply(null, parameters);
        trace("called", name, "with", parameters);
        return retval;
    }
    public function typedFunc(s:String, i:int):Boolean {
        return false;
    }
    override flash_proxy function getProperty(name:*):* { return customs[name]; }
    override flash_proxy function setProperty(name:*, value:*):void { customs[name] = value; }
}

1 个答案:

答案 0 :(得分:2)

在ActionScript中这并不容易,因为编译器不允许您在运行时使用“常规”ActionScript语言结构更改密封类的方法 - 因此您将无法改变其行为原班。期。

幸运的是,有as3commons:bytecode库。您可以使用它在运行时生成动态代理类:它生成类的字节数组表示并将其加载到AVM中,因此您可以像使用任何其他类一样使用它。甚至可以将原始类用作蓝图并将其替换为修改后的版本,但我必须承认我没有尝试过。