在同一课程中两次调用EventEmitter?

时间:2018-09-17 22:43:18

标签: javascript node.js oop events module

我目前正在NodeJS的EventEmitter上阅读a quick tutorial。这是该教程中的示例之一:

var events = require('events');

function Door(colour) {
  this.colour = colour;
  events.EventEmitter.call(this);

  this.open = function()
  {
  this.emit('open');
  }
}

Door.prototype.__proto__ = events.EventEmitter.prototype;

var frontDoor = new Door('brown');

frontDoor.on('open', function() {
    console.log('ring ring ring');
  });
frontDoor.open();

有些我不明白。在第五行,我们call EventEmitter。如果我没记错的话,这允许我们稍后再做类似的事情:

var myDoor = new Door('green');
myDoor.on('open', ...);

因此基本上,它允许直接从EventEmitter类的实例使用属于Door类的方法,对吗?

但是,第13行代码(Door.prototype.__proto__ = events.EventEmitter.prototype;)的目的是什么?这会将EventEmitter的属性复制到Door类。但是call方法还不是已经完成了吗?

我想我错过了一些事情...希望您能帮助我理解所有这些事情。

谢谢。

1 个答案:

答案 0 :(得分:3)

调用构造函数可让您使用父函数并将子实例替换为this。这样可以进行任何初始化,但不会 将父级的原型添加到子级函数中。这是一个简单的示例:

function Parent(name){
  this.name = name
  this.somProp = "some prop for " + name
}

Parent.prototype.test = function(){
  console.log(this.name, "testing")
}

// use Parent:

let p = new Parent("parent instance")
p.test()


function Child(name){
  // call parent constructor puts `.somProp` on your instance
  Parent.call(this, name)
}

let c = new Child("C")
// child instance has somProp because we called the parent constructor
console.log(c)

// BUT THIS IS AN ERROR //
// becuase it doesn't inherit the prototype //

c.test()

通过将__proto__属性设置为父函数原型,您现在可以访问父函数原型上的函数:

function Parent(name){
  this.name = name
  this.somProp = "some prop for " + name
}

Parent.prototype.test = function(){
  console.log(this.name, "testing")
}

function Child(name){
  Parent.call(this, name)
}
Child.prototype.__proto__  = Parent.prototype

let c = new Child("C")
c.test()  // now this works

尚不清楚的是,EventEmitter构造函数中是否需要初始化。如果查看文档,您会发现在调用函数时,发射器会将this设置为EventEmitter实例。因此,当您使用call初始化实例和不使用实例初始化实例时,可以查看实例之间的区别。例如,如果您不是call的超类,则您的实例将没有您可能想要的_maxListeners