我正在尝试创建自定义事件发射器。我似乎无法替换on
和emit
,如下所示。
on
和emit
分配给不同的方法,例如onTest
和emitTest
(有效)这是扩展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')
答案 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
调用毫无意义)