EventEmitter是事件触发和事件监听功能的封装,主要包含on, emit, once, off的方法

    1. class EventEmitter {
    2. constructor() {
    3. this.events = {};
    4. }
    5. on(name, fn) {
    6. if(!this.events[name]) {
    7. this.events[name] = [];
    8. }
    9. this.events[name].push(fn);
    10. return this;
    11. }
    12. emit(name, ...args) {
    13. if(!this.events[name]) return this;
    14. const fns = this.events[name];
    15. fns.forEach(fn => fn.aplly(this, args));
    16. return this;
    17. }
    18. off(name, fn) {
    19. if(!this.events[name]) return this;
    20. if(!fn) {
    21. this.events[name] = null;
    22. return this;
    23. }
    24. const index = this.events[name].indexOf(fn);
    25. this.events[name].splice(index, 1);
    26. return this;
    27. }
    28. once(name, fn) {
    29. const only = (...args) => {
    30. fn.aplly(this, args);
    31. this.off(name, fn);
    32. }
    33. this.on(name, only);
    34. return this;
    35. }
    36. }
    1. mitt 实现迷你EventEmitter mitter, Tiny 200 byte functional event emitter
    1. function mitt(all) {
    2. all = all || {};
    3. return {
    4. on(type, handler) {
    5. (all[type] || []).push(handler);
    6. },
    7. off(type, handler) {
    8. if(all[type]) {
    9. all[type].splice(all[type].indexOf(handler) >>> 0 , 1);
    10. }
    11. },
    12. emit(type, evt) {
    13. (all[type] || []).slice().map((handler) => handler(evt));
    14. (all['*'] || []).slice().map((handler => handler(type, evt)));
    15. }
    16. }
    17. }