2009-07-14 14 views
0

私はこのように、関数コールバックの配列を持っている:オブジェクトインスタンスのメソッドへの関数ポインタを使用するにはどうすればよいですか?

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 {} 

} 

私はこのコードを実行する場合は、私が代わりに "ローカル= 42" の "未定義=ローカル" を取得:だから

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

、フラッシュ関数ポインタはコンテキストを持ちません。この問題を解決する最良の方法は何ですか?

答えて

1

試してください:あなたは、 "文脈を運ぶ" したい場合は

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

または

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

してみてください:これはexpecteとしてthis.localにクロージャを作成

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

    f1(); 
} 

d

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; 
    } 
} 

をして何とかで非常に最後の宣言としてこれを追加します。

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

トリックを行います。 ... F2、F1に呼び出し、彼らは1回の余分の関数呼び出しを必要とするので、f3が、しかし遅くなり、ノート...

greetz

back2dos

+0

感謝が、これはちょっとやり過ぎだ – andrewrk

関連する問題