我正在学习 Node Js。我在我的书中遇到过一段代码,如下所示:
var EventEmitter = require("events").EventEmitter;
var inherits = require('util').inherits;
//Custom class
function Foo(){
EventEmitter.call(this);
}
inherits(Foo, EventEmitter);
Foo.prototype.connect = function(){
this.emit('connected');
}
var foo = new Foo();
foo.on('connected', function(){
console.log("connected raised!');
}
foo.connect();
我的问题是,这里的“调用”是做什么的?为什么 Foo 类继承自 EventEmitter?这是否意味着 Foo 是 Event Emitter 的 child ?如果是这样,那么它必须是 EventEmitter 的 child 吗?我在 Stackoverflow 中发现了另一个关于调用 (What does EventEmitter.call() do?) 的问题但是,我不明白提供的答案......谢谢
代码来源:Basarat Ali Syed 的 Beginning Node.js
最佳答案
代码行:
EventEmitter.call(this);
调用您正在继承的对象的构造函数,它允许 EventEmitter 代码初始化此对象的一部分,这是 Javascript 中继承过程的一部分。
EventEmitter()
是 EventEmitter 对象的构造函数。由于您需要使用与新对象相同的 this
调用该构造函数,因此必须将 .call()
或 .apply()
与该构造函数一起使用,以便使用正确的 this
。由于没有传递给构造函数的参数,.call()
是调用它的最简单方法。您必须调用
EventEmitter()
构造函数,以允许它正确初始化使用 new Foo()
创建的对象部分。在 Javascript 中使用继承时,多个单独的对象定义使用相同的对象来存储它们的属性和方法,因此每个对象都会初始化它们的对象部分,并且初始化是通过调用您继承的对象的构造函数开始的。这是关于 chaining constructors 主题的一个很好的引用。
从您的一些评论中可以看出您不明白代码中继承的意义是什么。该代码允许您创建一个对象类型
Foo
,它具有您自己的方法,但该对象也是一个 eventEmitter 并且具有 EventEmitter 的所有功能,因此它可以触发事件,响应事件等......这是称为“继承”,您可以使用自己的自定义对象继承其他对象的功能。为了使继承起作用,您的代码做了两件事。使用 inherits(Foo, EventEmitter);
代码行,它继承了另一个对象的原型(prototype),以便它具有所有相同的方法可用,并且使用 EventEmitter.call(this);
,它调用继承对象的构造函数,以便对象可以正确初始化自己。您可能想阅读几篇关于 Javascript 继承的引用文章:
Introduction to Object-Oriented JavaScript
Inheritance and the prototype chain
Understanding JavaScript Inheritance
What is "inheritance" in Javascript?
Inheritance: Object Oriented Programming
关于javascript - 什么是事件发射器调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30684966/