1. class Event {
    2. constructor () {}
    3. // 首先定义一个事件容器,用来装事件数组(因为订阅者可以是多个)
    4. handlers = {}
    5. // 事件添加方法,参数有事件名和事件方法
    6. addEventListener (type, handler) {
    7. // 首先判断handlers内有没有type事件容器,没有则创建一个新数组容器
    8. if (!(type in this.handlers)) {
    9. this.handlers[type] = []
    10. }
    11. // 将事件存入
    12. this.handlers[type].push(handler)
    13. }
    14. // 触发事件两个参数(事件名,参数)
    15. dispatchEvent (type, ...params) {
    16. // 若没有注册该事件则抛出错误
    17. if (!(type in this.handlers)) {
    18. return new Error('未注册该事件')
    19. }
    20. // 便利触发
    21. this.handlers[type].forEach(handler => {
    22. handler(...params)
    23. })
    24. }
    25. // 事件移除参数(事件名,删除的事件,若无第二个参数则删除该事件的订阅和发布)
    26. removeEventListener (type, handler) {
    27. // 无效事件抛出
    28. if (!(type in this.handlers)) {
    29. return new Error('无效事件')
    30. }
    31. if (!handler) {
    32. // 直接移除事件
    33. delete this.handlers[type]
    34. } else {
    35. const idx = this.handlers[type].findIndex(ele => ele === handler)
    36. // 抛出异常事件
    37. if (idx === undefined) {
    38. return new Error('无该绑定事件')
    39. }
    40. // 移除事件
    41. this.handlers[type].splice(idx, 1)
    42. if (this.handlers[type].length === 0) {
    43. delete this.handlers[type]
    44. }
    45. }
    46. }
    47. }

    使用

    1. var event = new Event() // 创建event实例
    2. // 定义一个自定义事件:"load"
    3. function load (params) {
    4. console.log('load', params)
    5. }
    6. event.addEventListener('load', load)
    7. // 再定义一个load事件
    8. function load2 (params) {
    9. console.log('load2', params)
    10. }
    11. event.addEventListener('load', load2)
    12. // 触发该事件
    13. event.dispatchEvent('load', 'load事件触发')
    14. // 移除load2事件
    15. event.removeEventListener('load', load2)
    16. // 移除所有load事件
    17. event.removeEventListener('load')