【发布时间】:2018-09-17 22:43:17
【问题描述】:
我目前正在 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();
有些东西我不明白。在第 5 行,我们call EventEmitter。如果我没记错的话,这让我们以后可以做类似的事情:
var myDoor = new Door('green');
myDoor.on('open', ...);
所以基本上它允许直接从Door 类的实例中使用属于EventEmitter 类的方法,对吧?
那么,第 13 行代码 (Door.prototype.__proto__ = events.EventEmitter.prototype;) 的用途是什么?这会将EventEmitter 的属性复制到Door 类。但是,call 方法不是已经完成了吗?
我想我错过了一些东西......我希望你能帮助我理解所有这些东西。
谢谢。
【问题讨论】:
-
现在没有时间输入正确的答案,但基本上调用的用途是处理 EventEmitter 构造函数中的任何初始设置。分配原型允许您调用它的函数,但是当它们尝试访问由于您没有执行构造函数而从未初始化过的实例的属性时它们会失败。
-
正在输入类似于 @Bligglenuber 的解释(不打算作为答案,因为我对 Node 的了解只是粗略,而且我从未听说过
EventEmitter)。如果您熟悉其他语言的 OOP,我要补充的一件事是,在函数MyFunction中调用OtherFunction.call(this)(假设两者都是“构造函数”)本质上是基于原型的 @987654335 @ 是OtherFunction的“子类”,并在子类的构造函数中调用super。 -
为什么不使用 ES6 语法来定义一个新类并继承自
EventEmitter?它更简单。
标签: javascript node.js oop events module