http://nodejs.org/docs/latest/api/util.html#util_util_inherits_constructor_superconstructor
在上述文档中,他们谈到了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
有了清晰的理解,谢谢。但我仍然不完全理解调用superConstructor的原因。将原型设置为superConstructor的新实例不足以吗? - ChevMyStream
的实例将继承EventEmitter.prototype
中的函数。当调用new MyStream()
时,EventEmitter
构造函数不会自动调用。 - go-olegconstructor
原型将被设置为从superConstructor
创建的新对象。”这是否意味着MyStream
的原型设置为EventEmitter
的实例,而不仅仅是EventEmitter.prototype
?如果是这样,这是否也意味着MyStream
将继承构造函数EventEmitter
在创建实例时添加到该实例中的任何内容?我不是说你错了,只是想要理解 :) - Chevinherits
函数代码中的Object.create
到底在做什么。我确实认为你是对的,文档中的内容是错误的。只是我不完全明白为什么会这样做。也许我不完全理解Object.create
的用处和它正在做什么?看起来它正在获取EventEmitter
的原型并向其中添加一个constructor
属性(我不确定它是干什么用的),然后将其分配给MyStream.prototype
。所以它只是与EventEmitter
相同的原型,带有一个constructor
属性? - ChevMyStream
的构造函数中调用EventEmitter
构造函数对this
是有意义的。我想这里有两件事让我感到困惑:1.为什么不创建一个新的EventEmitter
实例并将其分配给MyStream.prototype
?2.util.inherits
为新原型添加了一个constructor
属性,它是做什么用的? - Chev