javascript - 在同一个类中调用 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;
) 的目的是什么?这会将 的属性复制EventEmitter
到Door
类中。但是这个方法不是已经完成了call
吗?
我想我错过了一些东西......我希望你能帮助我理解所有这些事情。
谢谢。
解决方案
调用构造函数允许您使用父函数并将子实例替换为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
您可能想要的。
推荐阅读
- r - 需要帮助理解使用 R 中的 randomForestExplainer 库生成的下图
- go - Go中作为指针附加的局部变量的生命周期
- python - 2个类的实例,但似乎它们是相同的
- php - 如何在同一个 PHP 页面上多次使用 mysqli fetch_assoc() 和准备好的语句?
- javascript - 从给定数据生成 json 对象
- unity3d - 每个单位的像素(精灵)在哪里
- relational-algebra - 关系代数(健全性检查):客户包括所有 Tulsa 客户的分支机构
- javascript - 如何在未定义的 getElementsByClass 上运行 addEventListener?
- c# - C# wpf 去掉顶部的边距
- javascript - 将对象从 JSON rest api 推送到空数组中,这在 React 中不起作用