如何使用指向对象实例方法的函数指针?

时间:2009-07-14 12:48:10

标签: actionscript-2

我有一系列函数回调,如下所示:

class Blah {
    private var callbacks : Array;

    private var local : Number;

    public function Blah() {
        local = 42;

        callbacks = [f1, f2, f3];
    }

    public function doIt() : Void {
        callbacks[0]();
    }

    private function f1() : Void {
        trace("local=" + local);
    }

    private function f2() : Void {}
    private function f3() : Void {}

}

如果我运行此代码,我会得到“local = undefined”而不是“local = 42”:

blah = new Blah();
blah.doIt();

因此,Flash函数指针不带上下文。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

尝试:

callbacks[0].apply(this, arguments array)

callbacks[0].call(this, comma-separated arguments)

如果你想“携带语境”,请尝试:

public function doIt() : Void {
    var f1() : function (): Void {
        trace("local=" + local);
    }

    f1();
}

这会按预期在this.local上创建一个闭包

答案 1 :(得分:1)

最简单的方法是使用Delegate类...它使用Vlagged描述的技术工作...虽然我必须修改,我根本不理解代码(它在语法上也是不正确的)...

否则,试试这个:

class AutoBind {
    /**
     * shortcut for multiple bindings
     * @param   theClass
     * @param   methods
     * @return
     */
    public static function methods(theClass:Function, methods:Array):Boolean {
        var ret:Boolean = true;
        for (var i:Number = 0; i < methods.length; i++) {
            ret = ret && AutoBind.method(theClass, methods[i]);
        }
        return ret;
    }
    /**
     * will cause that the method of name methodName is automatically bound to the owning instances of type theClass. returns success of the operation
     * @param   theClass
     * @param   methodName
     * @return
     */
    public static function method(theClass:Function, methodName:String):Boolean {
        var old:Function = theClass.prototype[methodName];
        if (old == undefined) return false;
        theClass.prototype.addProperty(methodName, function ():Function {
            var self:Object = this;
            var f:Function = function () {
                old.apply(self, arguments);
            }
            this[methodName] = f;
            return f;
        }, null);
        return true;
    }
}

并将其添加为Blah中的最后一个声明:

private static var __init = AutoBind.methods(Blah, "f1,f2,f3".split(","));

那就是诀窍......请注意,对f1,f2和f3的调用会变慢,因为它们需要一个额外的函数调用......

格尔茨

back2dos