1. 程式人生 > >用es6方式的寫的訂閱釋出的模式--聽說越努力,煩心事越少,賺錢越多,越開心,你變強大了,很多人會來愛你。

用es6方式的寫的訂閱釋出的模式--聽說越努力,煩心事越少,賺錢越多,越開心,你變強大了,很多人會來愛你。

//釋出訂閱模式 class EventEmiter { constructor() { //維護一個物件 this. _events = {
} } on( eventName, callback) { if ( this. _events[ eventName]) { //如果有就放一個新的 this. _events[ eventName]. push( callback); } else { //如果沒有就建立一個數組
this. _events[ eventName] = [ callback] } } emit( eventName, ... rest) { console. log(... rest + 'rest的寫法') // alert(...rest) if ( this. _events[ eventName]) { //迴圈一次執行 this. _events[ eventName]. forEach(( item) =>
{ item. apply( this, rest) }); } } removeListener( eventName, callback) { alert( callback) if ( this. _events[ eventName]) { //當前陣列和傳遞過來的callback相等則移除掉 this. _events[ eventName] = this. _events[ eventName
]. filter( item => item !== callback); } } once( eventName, callback) { function one() { //在one函式執行原來的函式,只有將one清空 callback. apply( this, arguments); //先繫結 執行後再刪除 this. removeListener( eventName, one); } this. on( eventName, one); //此時emit觸發會執行此函式,會給這個函式傳遞rest引數 } } class Man extends EventEmiter { } let man = new Man() function findGirl() { console. log( '找新的女朋友') } function saveMoney() { console. log( '省錢') console. log( 'arguments' + JSON. stringify( arguments)); } // man.once('失戀', findGirl); // man.on('失戀', findGirl) //失戀 ,繫結一個函式方法 man. on( '失戀', saveMoney) //失戀 ,繫結一個函式方法 // man.removeListener('失戀', saveMoney); //移除一個函式方法 man. emit( '失戀', [ 'wewe', 'jjj']); // man.emit('失戀'); // man.emit('失戀'); //繫結一次,觸發多次,也只執行一次。觸發後一次將陣列中的哪一項刪除掉下次觸發就不會執行