JS发布订阅者模式
class Emit {
constructor() {
this.listening = {} // 监听列表
}
// 发布
$emit (key, fn) {
(this.listening[key] || (this.listening[key] = [])).push(fn)
}
// 订阅
$on () {
let triggerRef = Array.prototype.shift.call(arguments)
if (!this.listening[triggerRef] || this.listening[triggerRef].length === 0) {
return
}
let fns = this.listening[triggerRef]
for (let i = 0, fn; fn = fns[i]; i++) {
fn.apply(this, arguments)
}
}
// 移除
$off (key, fn) {
let fns = this.listening[key]
if (!fns) {
return false
}
if (!fn) {
fn && (fn.length = 0)
} else {
let fnIndex = fns.indexOf(fn)
fns.splice(fnIndex, 1)
return true
}
}
}
posted on 2021-08-21 18:30 chinesedon007 阅读(63) 评论(0) 收藏 举报
浙公网安备 33010602011771号