Emitter.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. var Class = require('./Class');
  2. var has = require('./has');
  3. var each = require('./each');
  4. var slice = require('./slice');
  5. var once = require('./once');
  6. var clone = require('./clone');
  7. exports = Class(
  8. {
  9. initialize: function Emitter() {
  10. this._events = this._events || {};
  11. },
  12. on: function(event, listener) {
  13. this._events[event] = this._events[event] || [];
  14. this._events[event].push(listener);
  15. return this;
  16. },
  17. off: function(event, listener) {
  18. var events = this._events;
  19. if (!has(events, event)) return;
  20. var idx = events[event].indexOf(listener);
  21. if (idx > -1) {
  22. events[event].splice(idx, 1);
  23. }
  24. return this;
  25. },
  26. once: function(event, listener) {
  27. this.on(event, once(listener));
  28. return this;
  29. },
  30. emit: function(event) {
  31. var _this = this;
  32. if (!has(this._events, event)) return;
  33. var args = slice(arguments, 1);
  34. var events = clone(this._events[event]);
  35. each(
  36. events,
  37. function(val) {
  38. return val.apply(_this, args);
  39. },
  40. this
  41. );
  42. return this;
  43. },
  44. removeAllListeners: function(event) {
  45. if (!event) {
  46. this._events = {};
  47. } else {
  48. delete this._events[event];
  49. }
  50. return this;
  51. }
  52. },
  53. {
  54. mixin: function(obj) {
  55. each(['on', 'off', 'once', 'emit', 'removeAllListeners'], function(
  56. val
  57. ) {
  58. obj[val] = exports.prototype[val];
  59. });
  60. obj._events = obj._events || {};
  61. }
  62. }
  63. );
  64. module.exports = exports;