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();