我正在学习 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/

10-12 00:07