无法扩展EventEmitter?

时间:2016-05-11 02:50:34

标签: javascript node.js events

我正在尝试创建自定义事件发射器。我似乎无法替换onemit,如下所示。

  • 我尝试将方法分配给其他变量并使用这些变量并删除原件(不起作用)
  • 我尝试将onemit分配给不同的方法,例如onTestemitTest(有效)

这是扩展EventEmitter的类:

import { EventEmitter } from 'events'

export default class MyEventEmitter extends EventEmitter {
  constructor () {
    super()
    this._on = this.on
    this._emit = this.emit
    delete this.on
    delete this.emit
  }
  on () {
    this._on.apply(this, Object.values(arguments))
  }
  emit () {
    this._emit.apply(this, Object.values(arguments))
  }
}

let event = new MyEventEmitter()

event.on('hi', () => console.log('meow'))

event.emit('hi')

这是堆栈:

$ babel-node ./src/event-store/my-event-emitter.js 
/Users/thomas/.nvm/versions/node/v5.10.0/lib/node_modules/babel-cli/node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js:0



RangeError: Maximum call stack size exceeded
    at Object.propertyIsEnumerable (native)
    at /Users/thomas/.nvm/versions/node/v5.10.0/lib/node_modules/babel-cli/node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js:12:32
    at values (/Users/thomas/.nvm/versions/node/v5.10.0/lib/node_modules/babel-cli/node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js:7:12)
    at MyEventEmitter.emit (my-event-emitter.js:15:28)
    at MyEventEmitter.emit (my-event-emitter.js:15:16)
    at MyEventEmitter.emit (my-event-emitter.js:15:16)
    at MyEventEmitter.emit (my-event-emitter.js:15:16)
    at MyEventEmitter.emit (my-event-emitter.js:15:16)
    at MyEventEmitter.emit (my-event-emitter.js:15:16)
    at MyEventEmitter.emit (my-event-emitter.js:15:16)

更新1

也尝试了这个并收到了同样的错误:

import { EventEmitter } from 'events'

export default class MyEventEmitter extends EventEmitter {
  constructor () {
    super()
  }
  on () {
    this.on.apply(this, Object.values(arguments))
  }
  emit () {
    this.emit.apply(this, Object.values(arguments))
  }
}

let event = new MyEventEmitter()

event.on('hi', () => console.log('meow'))

event.emit('hi')

1 个答案:

答案 0 :(得分:4)

您重新定义这些继承方法的尝试以this._emit === this.emit结束,这反过来又在调用中产生无限递归。

如果要覆盖方法,则应该这样做。无需将其重新分配给其他名称或尝试删除实例甚至不具备的属性。

export default class MyEventEmitter extends EventEmitter {
  on(...args) {
    return super.on(...args)
  }
  emit(...args) {
    return super.emit(...args);
  }
}

(我认为那些Object.values调用毫无意义)

相关问题