イベントモジュールを達成するためにネイティブコードを使用して、カスタムイベントサブスクリプション、トリガ、機能削除を実装することができます

イベント機能(){
   // 場所に追加されたすべてのモニター・イベント
  この ._events = {} 
} 
Events.prototype = { 
  ON:機能(名前、のFn、... argOrg){ 
    //は、パラメータの検証に合格する
    のIF(名前|! !| FN){
       スロー 新しい新しいエラーが発生しました( `[イベント例外TypeError]は実行に失敗しましたイベント ON $ {name}を2つの引数が必要)`
       リターンを
    } 
    // 同じモニターの繰り返しの追加防ぐ 
    FNSをしましょう= この [._eventsを名前] || []
     IF(fns.find(項目=> item.fnOrg === FN)){
       リターン
    } 
    この ._events [名前] = fns.concat({ 
      FN:引数 => fn.apply(ヌル、[... argOrg、...引数])、
      fnOrg:FN 
    })
  }、
  一度:関数(名前、 FN、... argOrg){ 
    CONST onFn =(...引数)=> { 
      fn.apply(NULL 、引数)
       この.off(名前、onFn)
    } 
    この.on(名前、onFn、... argOrg)
  }、
  EMIT:関数(名前、...のarg){ この ._events [名前] || [])のforEach(項目=> { 
      item.fn(引数)
    })
  }、
  OFF:機能(名前、FN){ 
    // パラメータなし:すべてのリスナーをクリア
    IF!(arguments.lengthを){
       この ._events = Object.create(ヌル
    } 
    // 1つの引数:イベントがクリアされますすべてのリスナーに名前を
    IF(== arguments.lengthを。1 ){ 
      削除._events [名] 
    } 
    FNSせ = この._events [名];
     IF(!fns.lengthのFNS ||!)リターン;
     この ._events [名前] =(FNS || [])フィルタ(項目=> {
       リターン item.fnOrg ==!FN  
    })。
  } 
} 
// 调用デモ
のconst  イベント = 新しいイベント();
constの FN1 =(...引数)=>はconsole.log(' 私が欲しいSLEEP1 ' 、...引数)
 のconst FN2 =(...引数)=>はconsole.log(' 私はSLEEP2をしたいです' 、...引数)
 // パート1:添加多次监听
イベント .on(' スリープ'、FN1、123 );
イベント .on(' スリープ'、FN2、456)。
イベント .emit(' SLEEP '7。 8。 9。);
 // 出力
 // 私が欲しいSLEEP1 1 2. 5. 4. 3. 6。
 // 私が欲しいSLEEP2 1 2. 5. 4. 3. 6。

// パート2は:一度だけ聴いたら、トリガ
イベントを .once(' SLEEP1が'、もう一度Fn1、1112である);
 イベント .emit(' SLEEP1 '13である);
 イベント .emit(' SLEEP1 '13である);
 // 出力
 //SLEEP1が欲しい11 12 13はIである。

// その3:繰り返し聞く"同じコールバック"無効(匿名関数を除く)
イベント .on(' SLEEP2 '、Fn2が、22である);
 イベント .on(' SLEEP2 '、Fn2が、23はある);
 イベント。 EMIT(' SLEEP2 '25 );
 // 出力
 // 私はSLEEP2 22が25である必要

// その3:クリアリスナー
イベント .off(' SLEEP2 ' 、Fn2が);
 イベント .off(' SLEEP1 '); //がイベントをクリアすべてのリスナー
イベント .off(); // すべてクリア
イベント .emit(' SLEEP2 '25 );
 // 出力
 // ません

 

おすすめ

転載: www.cnblogs.com/liujinyu/p/12079961.html