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)
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)
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.EventEmitter到MyStream.super_。
调用构造events.EventEmitter.call(this);函数events.EventEmitter,以便每当MyStream创建新对象时都会执行它。这相当于super()用Java等其他语言调用。
| 归档时间: |
|
| 查看次数: |
3301 次 |
| 最近记录: |