无法扩展类,未定义额外的方法

时间:2018-08-14 16:36:58

标签: javascript webpack ecmascript-6 babeljs es6-class

假设我有以下课程:

import EventEmitter from 'event-emitter';

export default class SharedChannel extends EventEmitter {
  constructor(opts) {
    super();
    console.log('SharedChannel constructor');
  }

  send(event, data) {
    console.log('SharedChannel send');
  }
}

在我的应用程序中,我尝试使用该类:

import SharedChannel from './lib/SharedChannel';
const channel = new SharedChannel();
channel.send('sessionData', 'Some session data goes here');

我收到以下错误:

  

未捕获的TypeError:channel.send不是函数

EventEmitter类中的方法可以工作,但我的send方法却不能。例如,我可以打电话给channel.emit()。另外,我能够从该类构造函数中访问类方法。例如,我可以在channel.send()之后立即致电super()。我可以通过在构造函数中调用this.send = function() { ...来解决它,但是当然,这不是必须的。

此应用程序是使用Webpack和Babel构建的。在我的webpack.config.js中,我有以下Babel规则:

{
  test: /\.js$/,
  exclude: /(node_modules|bower_components)/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['@babel/preset-env']
    }
  }
}

.babelrc中:

{
  "presets": ["@babel/preset-env"]
}

软件包版本:

"@babel/core": "^7.0.0-rc.1",
"@babel/plugin-proposal-object-rest-spread": "^7.0.0-rc.1",
"@babel/preset-env": "^7.0.0-rc.1",
"babel-loader": "^8.0.0-beta",
"webpack": "^4.16.5",
"webpack-cli": "^3.1.0"

关于如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:1)

您正在滥用EventEmitter的API。它不是要用作父类,它是一个mixin。例如,如果我们查看the usage documentation

var ee = require('event-emitter');

var MyClass = function () { /* .. */ };
ee(MyClass.prototype);

ee调用MyClass.prototype函数会将事件发射器逻辑混合到类原型上。同样,在您的示例中,您想要

import EventEmitter from 'event-emitter';

export default class SharedChannel {
  constructor(opts) {
    console.log('SharedChannel constructor');
  }

  send(event, data) {
    console.log('SharedChannel send');
  }
}
EventEmitter(SharedChannel.prototype);