用es6方式的寫的訂閱釋出的模式--聽說越努力,煩心事越少,賺錢越多,越開心,你變強大了,很多人會來愛你。
阿新 • • 發佈:2018-12-08
//釋出訂閱模式
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('失戀');
//繫結一次,觸發多次,也只執行一次。觸發後一次將陣列中的哪一項刪除掉下次觸發就不會執行
} } on( eventName, callback) { if ( this. _events[ eventName]) { //如果有就放一個新的 this. _events[ eventName]. push( callback); } else { //如果沒有就建立一個數組