繁体   English   中英

在ES6类定义中设置扩展EventEmitter的事件侦听器

[英]Set event listeners in ES6 class definition that extends EventEmitter

我想要一些预定义的自定义侦听器,它们已经定义了类的定义 (就像'newListner'事件中的构建一样)。 所以我不想只在构造函数中绑定它们,因为它将在该类的每个新实例上执行。

这该怎么做? 修改原型? 有可能吗?

到目前为止我所拥有的:

class Cat extends EventEmitter {
  // just added for demonstration, I don't want this!
  constructor() {
    super();
    // does fire
    this.on('wave', function() { console.log('constructor wave'); });
  }
}
// compiles but does not fire
Cat.prototype.on('wave', function() { console.log('prototype wave'); });

var cat = new Cat();
cat.emit('wave');

您无法避免为每个实例单独注册侦听器,并且在构造函数1,2中执行此操作的自然位置。 但是,您可以避免创建新的侦听器函数:

class Cat extends EventEmitter {
  constructor() {
    super();
    this.on('wave', this.onWave);
  }
  onWave() {
    console.log('prototype wave');
  }
}

var cat = new Cat();
cat.emit('wave');

1:还有其他方法,比如._events的getter。 你可以做各种各样的花哨的东西,包括“默认”听众的原型继承,但那些完全过于复杂,并迅速超越你的头脑。 你可以通过在构造函数中放入一些通用代码来做一些奇特的事情 - 而且更干净。
2:你也可以覆盖(特殊化)EventEmitters的init方法,但它归结为完全相同。

因为,据我所知, Cat发射器的多个实例无法相互通信,您必须在构造函数中为每个实例注册侦听器:

class Cat extends EventEmitter {
  constructor() {
    super();
    this.on('wave', function() { console.log('constructor wave'); });
  }
}

var cat = new Cat();
cat.emit('wave');

然后,您可以随时在整个不同的文件共享您的发射器实例由require将其投入你需要它的脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM