原理
原理就是发布-订阅。
本次实现了几个功能
- 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;
