首页 > 解决方案 > 在同一个类中调用 EventEmitter 两次?

问题描述

我目前正在阅读有关NodeJS的快速教程。EventEmitter这是该教程中的示例之一:

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();

有些东西我不明白。在第 5 行,我们call是 EventEmitter。如果我没记错的话,这可以让我们稍后做类似的事情:

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

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

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

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

谢谢。

标签: javascriptnode.jsoopeventsmodule

解决方案


调用构造函数允许您使用父函数并将子实例替换为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您可能想要的。


推荐阅读