| INDEX |

最近、よくProxy関連のエントリーを見るなぁとか思ったのは錯覚なのかわかりませんが、fladdictさんのエントリーがなるほど便利だなぁと思ったわけです。
で、Proxy使ってみようということで、イベントAdapter的なものを書いてみました。全然<Proxy>ぽくないけど。ありがちなので既出のような気もしますが。

FAdapter.as

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 などで入力補助がでないところ…です。

| INDEX |