gpt4 book ai didi

javascript - 在同一个类中调用 EventEmitter 两次?

转载 作者:行者123 更新时间:2023-11-30 11:14:02 25 4
gpt4 key购买 nike

我正在阅读 a quick tutorial在 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 行,我们调用 EventEmitter。如果我没记错的话,这允许我们稍后做类似的事情:

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

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

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

我想我错过了什么……我希望你能帮助我理解所有这些事情。

谢谢。

最佳答案

调用构造函数允许您使用父函数并将子实例替换为 this。这允许进行任何初始化,但它不会将父函数的原型(prototype)添加到子函数。这是一个简单的例子:

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__ 属性设置为父函数原型(prototype),您现在可以访问父函数原型(prototype)上的函数:

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 初始化实例和不使用初始化实例之间的区别。例如,如果您不调用 父类(super class),您的实例将不会有您可能需要的_maxListeners

关于javascript - 在同一个类中调用 EventEmitter 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52376591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com