原理
原理就是发布-订阅。
本次实现了几个功能
- on 注册事件
- emit 触发事件
- off 注销事件
- once 执行一次后注销事件
- newListener 每次注册新事件时触发
代码如下:
function EventEmitter() {
this._events = {};
}
EventEmitter.prototype.on = function (eventName, callback) {
if (!this._events) {
this._events = Object.create(null);
}
if (eventName !== 'newListener') {
this._events['newListener'] ? this._events['newListener'].forEach(fn => fn.call(this, eventName)) : void 0;
}
if (this._events[eventName]) {
this._events[eventName].push(callback);
} else {
this._events[eventName] = [callback];
}
}
EventEmitter.prototype.emit = function (eventName, ...args) {
if (!this._events) {
this._events = Object.create(null);
}
if (this._events[eventName]) {
this._events[eventName].forEach(fn => fn.call(this, ...args))
}
}
EventEmitter.prototype.off = function (eventName, callback) {
if (!this._events) {
this._events = Object.create(null);
}
if (this._events[eventName]) {
this._events[eventName] = this._events[eventName].filter(fn => {
return fn !== callback && fn.l !== callback
})
}
}
EventEmitter.prototype.once = function (eventName, callback) {
if (!this._events) {
this._events = Object.create(null);
}
function one(...args) {
callback(...args);
this.off(eventName, one)
}
one.l = callback;
this.on(eventName, one);
}
module.exports = EventEmitter;