メソッドの付け替え

MovieClipには、マウスオーバー時とかロード時に呼ばれる各種イベントハンドラがありますが、
デフォルトではハンドラメソッドは1つしかないため、既に定義が行われている場合に新規で
ハンドラを付けると、上書きされてしまいます。

//引数のMCに、マウスリリース時のハンドラをつける
public function addHandler(mc:MoveiClip):Void{
 mc.onRelease = function(){
    trace("上書き");
  } 
}

この場合、次のようなコードにすると、既存のハンドラを上書きせずに両方動作させることが出来ます。

public function addHandler(mc:MoveiClip):Void{
  if(mc.onRelease != null){
    mc.oldOnRelease = mc.onRelease//既存のメソッドをoldOnReleaseという名前に付け替え
  }
 mc.onRelease = function(){
    trace("上書き");    
    if(this.oldOnRelease != null){
      this.oldOnRelease();//付け替えたメソッドを呼ぶ      
    }
  } 
}

付け足したハンドラを1度だけ動作させたい場合は、

public function addHandler(mc:MoveiClip):Void{
  if(mc.onRelease != null){
    mc.oldOnRelease = mc.onRelease;//既存のメソッドをoldOnReleaseという名前に付け替え
  }
 mc.onRelease = function(){
    trace("上書き");    
    this.onRelease=undefined;
    if(this.oldOnRelease != null){
      this.oldOnRelease();//付け替えたメソッドを呼ぶ
      this.onRelease = this.oldOnRelease;
      this.oldOnRelease = undefined;//元に戻して消去
    }
  } 
}

とやるとOKです。動作的にはアスペクトのような感じになります。

ただし、これはちょっとした動作を追記したいときに有効なテクなので、
本格的に複数イベントハンドラを登録したい場合は、
mx.events.EventDispatcherクラスの利用がおすすめです。

mx.events.EventDispatcher.initialize(ハンドラを付けたいMC)

とやると、addEventHandlerというメソッドがMCに追加されますので、このメソッド
使って複数のリスナーを登録することが出来るようになります。