書き物

技術とか作った物の話とか愚痴文句感想など

Event::targetには何が設定されているのか

dispatchEventメソッドでイベントを発生させたりしていたのですが、Eventクラスのtargetプロパティって、何が設定されているのかが気になりました。

Flex3のasdocのEvent::targetには以下のように書かれています。

イベントターゲットです。このプロパティにはターゲットノードが含まれます。例えば、ユーザーが [OK] をクリックした場合、ターゲットノードはそのボタンを含む表示リストノードです。

つまり、[OK]ボタンをクリックした場合、Event::targetには[OK]ボタンが設定されているということ?

まどろっこしいッ!


試しに以下のクラスに対して、Testクラスを実行してみます。

TestDispatcher.as

package
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class TestDispatcher extends EventDispatcher
{
public function TestDispatcher()
{
super();
}
public function runDispatch():void
{
dispatchEvent(new Event(Event.COMPLETE));
}
}
}
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Test extends Sprite
{
private var _dispatcher:TestDispatcher;
public function Test()
{
super();
_dispatcher = new TestDispatcher();
_dispatcher.addEventListener(Event.COMPLETE, onComplete);
_dispatcher.runDispatch();
}
private function onComplete(event:Event):void
{
if (event.target == _dispatcher)
{
trace("target == _dispatcher");
}
else
{
trace("target != _dispatcher");
}
}
}
}

出力は「target == _dispatcher」となり、dispatchEventが実行されたクラスがEvent::targetに設定されているようです。


Event::targetは読み取り専用プロパティということで、データの設定を手動で行えないのですが、

dispatchEventメソッド内でinternalだったり何かしらのnamespaceであるtargetのsetterでも呼んでいるんですかね?


IEventDispatcherを使用する場合は、実装するEventDispatcherのコンストラクタにthisを渡して使うみたいなので、

その場合送出されるEvent::targetにはこのthisが設定されるに違いない。


なるほど。

これで大っぴらにEventを使えそうです。