Proxyを使ってオブジェクトのメソッド呼び出しをインターセプトするサンプル
Proxyを使うと、オブジェクトのメソッド呼び出しやプロパティへのアクセスをインターセプトする仕組みが作れます。
- 機能的にはJavaのProxyに近い感じです。
- メソッド以外にも、属性へのアクセスや「for...in」「for...each in 」で属性を列挙された場合の動作なども捕捉可能です。
以下は、Proxyを使ってメソッドの呼び出しと属性値の参照をインターセプトし、結果の末尾に「sir.」をつけるサンプルです。
package { import flash.display.*; import flash.text.*; public class ProxySample extends Sprite { public function ProxySample(){ // 結果の表示用テキストフィールド var stdout:TextField = new TextField(); stdout.width = 500; stdout.height = 500; addChild(stdout); // インターセプトの対象とするオブジェクト var mii:Kitten = new Kitten( "mii" ); // プロキシを設定する var proxy:* = new AppendSirFilter( mii ); var str:String = ""; str += proxy.meow() + "\n"; // メソッド呼び出し str += proxy.name + "\n"; // 属性値の参照 stdout.text = str; } } } // インターセプトの対象とするクラス class Kitten { public var name:String; public function Kitten( name:String ){ this.name = name; } public function meow():String{ return "meow!" } } import flash.utils.Proxy; import flash.utils.flash_proxy; // コンストラクタで指定したオブジェクトのメソッド呼び出しをインターセプトして、 // 戻り値の末尾に「sir.」をつける。 dynamic class AppendSirFilter extends Proxy { private var delegate:*; function AppendSirFilter( delegate:* ) { this.delegate = delegate; } // メソッド呼び出し結果に「sir.」をつける。 flash_proxy override function callProperty(name:*, ...rest):* { return delegate[name].apply( delegate, rest ) + " sir." } // 属性の参照結果にも「sir.」をつける。 flash_proxy override function getProperty(name:*):* { return delegate[name] + " sir." } }
これを使えばアスペクトがさくっと作れそうですね。JavaScriptにもこういうのがあればいいのに。