有人可以用更外行的术语解释 util.inherits 的作用吗?

Che*_*hev 8 javascript inheritance prototype prototypal-inheritance node.js

http://nodejs.org/docs/latest/api/util.html#util_util_inherits_constructor_superconstructor

在上面的文档中,他们谈到util.inherits需要两个构造函数。我试图将我的大脑围绕在他们提供的代码示例中。我知道 aStream是什么,我知道 anEventEmitter是什么,我明白为什么你想让流继承,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!"
Run Code Online (Sandbox Code Playgroud)

Raf*_*sta 7

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();
Run Code Online (Sandbox Code Playgroud)


go-*_*leg 6

util.inherits 你可以在这里找到它的实现:

exports.inherits = function(ctor, superCtor) {
  ctor.super_ = superCtor;
  ctor.prototype = Object.create(superCtor.prototype, {
    constructor: {
      value: ctor,
      enumerable: false,
      writable: true,
      configurable: true
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

它本质上是在执行您所描述的操作(创建 的实例events.EventEmitter.prototype并将其设置为 的原型MyStream)以及附加 附加events.EventEmitterMyStream.super_

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