我目前正在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
方法还不是已经完成了吗?
我想我错过了一些事情...希望您能帮助我理解所有这些事情。
谢谢。
答案 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
。