2012-04-20 78 views
3

我知道使用動態添加到動態代理類的函數很容易,但我也希望能夠攔截對類型化函數的調用,就像您可以使用Python中的裝飾器一樣。下面的例子。我喜歡某種方式熬過「的callProperty」爲'typedFunc就像它已經經歷「dynFunc」,任何方式來攔截AS3中的類型函數調用?

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

回答

2

這是不容易在ActionScript做,因爲編譯器不會允許您在運行時使用「常規」ActionScript語言結構更改密封類的方法 - 因此您將無法更改原始類的行爲。期。

幸運的是,有as3commons:bytecode庫。您可以使用它在運行時生成動態代理類:它會生成類的字節數組表示形式並將其加載到AVM中,因此您可以像使用其他類一樣使用它。甚至可以使用原始類作爲藍圖,並用修改後的版本替換它,但我必須承認我沒有嘗試過。