【发布时间】:2014-06-30 06:07:05
【问题描述】:
我一直在关注 Manuel Teixiera 的 Hands-On Node.js,在阅读事件发射器一章时偶然发现了这种奇怪的行为。
作者建议的代码是这样的:
var EventEmitter = require("events").EventEmitter;
var util = require ("util");
var MyClass = function() {};
util.inherits(MyClass, EventEmitter);
var instance = new MyClass();
instance.on("custom", function() {
console.log("Holo");
});
instance.emit("custom");*/
输出“Holo”就好了。但是,我还阅读了文档和SO questions,主题是使用new Function(); 是一种反模式,它违背了javascript 对原型继承的预期用途。 This article by David Walsh 说明了在 js 上强制经典继承与使用其功能进行原型继承之间的区别。
所以,我尝试通过这样重写代码来修改我的代码:
var EventEmitter = require("events").EventEmitter;
var clock = {};
util.inherits(clock, EventEmitter);
clock.on("custom", function(){
console.log("Holo");
});
clock.emit("custom");
我收到一条错误消息 TypeError: Object object has no method 'on'。我不明白为什么会这样,因为我使用 util.inherit() 助手创建了时钟对象。使用var clock = Object.create(EventEmitter) 的相同代码也不起作用。
我可以让代码工作的唯一实例是:
var EventEmitter = require("events").EventEmitter;
var util = require("util");
var clock = {};
util.inherits(clock, EventEmitter);
clock.prototype.on("custom", function(){
console.log("Holo");
});
clock.emit = function(){
clock.prototype.emit("custom");
}
clock.emit();
这输出“Holo”就好了。问题是,我不明白为什么我需要访问原型来设置事件侦听器或发出事件,据说我将clock 变量委托给EventEmitter 对象的方法,所以他们应该没有原型符号也能正常工作。
你能帮帮我吗?
【问题讨论】:
标签: javascript node.js inheritance prototypal-inheritance