イベント機能(){ // 場所に追加されたすべてのモニター・イベント この ._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、1、2、3 ); イベント .on(' スリープ'、FN2、4、5、6)。 イベント .emit(' SLEEP '、7。 、8。 、9。); // 出力 // 私が欲しいSLEEP1 1 2. 5. 4. 3. 6。 // 私が欲しいSLEEP2 1 2. 5. 4. 3. 6。 // パート2は:一度だけ聴いたら、トリガ イベントを .once(' SLEEP1が'、もう一度Fn1、11、12である); イベント .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 ); // 出力 // ません