最近、よくProxy関連のエントリーを見るなぁとか思ったのは錯覚なのかわかりませんが、fladdictさんのエントリーがなるほど便利だなぁと思ったわけです。
で、Proxy使ってみようということで、イベントAdapter的なものを書いてみました。全然<Proxy>ぽくないけど。ありがちなので既出のような気もしますが。
FAdapter クラスの目的は、なにか命題的になっている「イベント処理系をいかにサクッと書くか」「リスナー書くの指だれます」といった課題に何かしらの手段を提供するものです。特にaddEventListenerとか、removeEventListenerやらが対象です。
リスナの登録
リスナの登録は以下のようにして書きます。
//対象になるEventDispatcherを指定 var adapter:FAdapter = new FAdapter(stage); //登録 adapter.click = function( e:MouseEvent ):void { trace( "test1", e.type ) };
登録はAS2のような書き方ですね。adapter.* の部分にイベントタイプを指定するわけです。書き換えるとこんな感じ。
adapter[MouseEvent.CLICK] = function( e:MouseEvent ):void { trace( "test1", e.type ) };
propertyで指定するので以下のような書き方もできます。
adapter.click = adapter.mouseDown = function( e:MouseEvent ):void { trace( "test1", e.type ) };
useCapture、weakReferenceなどを指定する場合は以下の通り。
//イベントタイプをメソッド名にして指定。handler以外は省略可 adapter.click( handler, capture, priority, weakReference ); //ノーマルにも書けます adapter.addEventListener( type, handler, capture, priority, weakReference );
リスナの削除関係
リスナの削除は以下のようにして書きます。
delete adapter.click; //あるいは adapter.click = null; //普通に消す場合の方法 adapter.removeEventListener("click"); //全削除 adapter.removeAll();
一応、停止と再開もできます。引数にイベントタイプを入れます。省略すると対象が全部になります。
//停止 adapter.abort("click"); //再開 adapter.resume("click");
アダプター的なところ
アダプター的なところは以下ような書き方です。
//対象はとりあえずなしでもいけます var adapter:FAdapter = new FAdapter(); adapter.click = function( e:MouseEvent ):void { trace( "test1", e.type ) }; //あとで付ける adapter.dispatcher = stage;
補足
adapter.eventType で返されるオブジェクトは $listener(FAdapter の innerClass) です。このオブジェクトのpropertyでリスナの情報が見れます(読みのみ)。
- adapter.eventType.type
- adapter.eventType.handler
- adapter.eventType.useCapture
- adapter.eventType.priority
- adapter.eventType.useWeakReference
- adapter.eventType.active ( :Boolean abort中はfalse )
まとめみたいな
以上、全然Proxyの目的に沿ってないようですが、Proxyの動的な部分に注目して書いてみました。例外処理とか怪しいし改善点も多いですが、はじめての Proxy ということで。使いながらデバッグとか改善とかできればいいかと。一番の問題点は、当然ですが FlashDevelop などで入力補助がでないところ…です。