Javascript 有人能用更通俗的术语解释util.inherits的作用吗?

Javascript 有人能用更通俗的术语解释util.inherits的作用吗?,javascript,node.js,inheritance,prototype,prototypal-inheritance,Javascript,Node.js,Inheritance,Prototype,Prototypal Inheritance,在上面的文档中,他们讨论了使用两个构造函数的util.inherits。我正试着围绕着他们提供的代码样本来思考。我知道什么是Stream,我知道什么是EventEmitter,我也知道为什么要让流从EventEmitter继承,但我真的很困惑他们是怎么做的 util.inherits到底在做什么?为什么他们要创建一个新的构造函数来调用events.EventEmitter.call(this)?这种奇怪的处理方式与创建一个新的EventEmitter实例并将其设置为MyStream.protot

在上面的文档中,他们讨论了使用两个构造函数的
util.inherits
。我正试着围绕着他们提供的代码样本来思考。我知道什么是
Stream
,我知道什么是
EventEmitter
,我也知道为什么要让流从
EventEmitter
继承,但我真的很困惑他们是怎么做的

util.inherits
到底在做什么?为什么他们要创建一个新的构造函数来调用
events.EventEmitter.call(this)?这种奇怪的处理方式与创建一个新的
EventEmitter
实例并将其设置为
MyStream.prototype
有什么区别

为方便起见,以下是本文中的代码示例:

var util = require("util");
var events = require("events");

function MyStream() {
    events.EventEmitter.call(this);
}

util.inherits(MyStream, events.EventEmitter);

MyStream.prototype.write = function(data) {
    this.emit("data", data);
}

var stream = new MyStream();

console.log(stream instanceof events.EventEmitter); // true
console.log(MyStream.super_ === events.EventEmitter); // true

stream.on("data", function(data) {
    console.log('Received data: "' + data + '"');
})
stream.write("It works!"); // Received data: "It works!"

您可以找到
util.inherits的实现:

它本质上是按照您所描述的操作(创建
events.EventEmitter.prototype
的实例,并将其设置为
MyStream
的原型)以及将
events.EventEmitter
附加到
MyStream.super


events.EventEmitter.call(this)
调用
events.EventEmitter
构造函数,以便在创建新的
MyStream
时执行它。这相当于在Java等其他语言中调用
super()

我现在清楚了
util.inherits
,谢谢。我仍然不完全理解超级构造函数的要求。将原型设置为超级构造函数的新实例难道还不够吗?@AlexFord:设置原型只意味着
MyStream
的实例将从
EventEmitter.prototype
继承函数。调用
new MyStream()
时,不会自动调用
EventEmitter
构造函数。Hmmm,这似乎与文本所说的不一致。“将
构造函数的原型设置为从
超级构造函数
创建的新对象”这难道不意味着
MyStream
的原型设置为
EventEmitter
的实例,而不仅仅是
EventEmitter.prototype
?如果是这样,这难道不意味着
MyStream
将继承
EventEmitter
构造函数在创建实例时添加到实例中的任何内容吗?我不是说你错了;只是想理解:)我想我在试图弄清楚
对象发生了什么事情时迷路了。在你发布的
继承
函数代码中创建
。我认为你是对的,文档中的文本是错误的。我只是不完全明白为什么要这样做。也许我只是没有完全理解
Object.create
的用处以及它在做什么?看起来它采用了
EventEmitter
的原型,并向其添加了
构造函数
属性(不确定其作用),然后将其分配给
MyStream.prototype
。因此,它与
EventEmitter
具有
constructor
属性的
EventEmitter
协议是一样的?我想在
MyStream
的构造函数中调用
EventEmitter
构造函数是有意义的。我想有两件事我很困惑:1。为什么不创建一个新的
EventEmitter
实例并将其分配给
MyStream.prototype
?2.为什么
util.inherits
向新原型添加
constructor
属性,它做什么?
var util = require('util');

function Person() {
    this.firstname = 'John';
    this.lastname = 'Doe';
}

Person.prototype.greet = function() {
    console.log('Hello ' + this.firstname + ' ' + this.lastname);
}

function Policeman() {
    Person.call(this);
    this.badgenumber = '1234';
}

util.inherits(Policeman, Person);
var officer = new Policeman();
officer.greet();
var util = require('util');

function Person() {
    this.firstname = 'John';
    this.lastname = 'Doe';
}

Person.prototype.greet = function() {
    console.log('Hello ' + this.firstname + ' ' + this.lastname);
}

function Policeman() {
    Person.call(this);
    this.badgenumber = '1234';
}

util.inherits(Policeman, Person);
var officer = new Policeman();
officer.greet();