Javascript 无法扩展EventEmitter?
我正在尝试创建一个自定义事件发射器。似乎我无法替换on和emit,如下所示 我曾尝试将这些方法分配给其他变量并使用它们,但删除原始变量不起作用 我尝试过将on和emit分配给不同的方法,比如onTest和emitTest,它们都可以工作 下面是扩展EventEmitter的类: 这是堆栈:Javascript 无法扩展EventEmitter?,javascript,node.js,events,Javascript,Node.js,Events,我正在尝试创建一个自定义事件发射器。似乎我无法替换on和emit,如下所示 我曾尝试将这些方法分配给其他变量并使用它们,但删除原始变量不起作用 我尝试过将on和emit分配给不同的方法,比如onTest和emitTest,它们都可以工作 下面是扩展EventEmitter的类: 这是堆栈: $ babel-node ./src/event-store/my-event-emitter.js /Users/thomas/.nvm/versions/node/v5.10.0/lib/node_mo
$ 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')
您试图重新定义这些继承方法的结果是。\u emit===this.emit,这反过来会在调用中产生无限递归 如果您想覆盖方法,您应该这样做。无需将它们重新分配给其他名称,也无需尝试删除实例甚至没有的属性
export default class MyEventEmitter extends EventEmitter {
on(...args) {
return super.on(...args)
}
emit(...args) {
return super.emit(...args);
}
}
我认为那些Object.values调用是毫无意义的您试图重新定义这些继承的方法,结果是这样的。_emit===this.emit,这反过来又在调用中产生无限递归 如果您想覆盖方法,您应该这样做。无需将它们重新分配给其他名称,也无需尝试删除实例甚至没有的属性
export default class MyEventEmitter extends EventEmitter {
on(...args) {
return super.on(...args)
}
emit(...args) {
return super.emit(...args);
}
}
我想那些Object.values调用是没有意义的我尝试过将这些方法分配给其他变量并使用它们-为什么?别那么做。删除原件-再说一遍,为什么?您不能这样做,因为它们是原型方法。@Bergi您是在建议我刚才在UPDATE 1的代码块中放入的内容吗?不完全是,它们应该是超级调用。请看我的答案:-我尝试过将这些方法分配给其他变量并使用它们-为什么?别那么做。删除原件-再说一遍,为什么?您不能这样做,因为它们是原型方法。@Bergi您是在建议我刚才在UPDATE 1的代码块中放入的内容吗?不完全是,它们应该是超级调用。请参阅我的答案:-如果我想在构造函数中设置此属性,我在这里该怎么做?不给super打电话是没办法的。@ThomasReggi:当然,这不是问题。我只是在这里省略了默认构造函数,因为您还没有创建自定义属性。但是如果不调用super,我就无法拥有构造函数并设置此属性。在super之前不允许出现此错误。是的,只需调用super!为什么要避免它?如果要在构造函数中设置此属性,我在这里该怎么做?不给super打电话是没办法的。@ThomasReggi:当然,这不是问题。我只是在这里省略了默认构造函数,因为您还没有创建自定义属性。但是如果不调用super,我就无法拥有构造函数并设置此属性。在super之前不允许出现此错误。是的,只需调用super!你为什么要回避它?