//發布訂閱模式
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('失戀');
//綁定一次,觸發多次,也只執行一次。觸發后一次將數組中的哪一項刪除掉下次觸發就不會執行
