我在javascript而不是node.js中有一个特定的问题来继承:
// foo.js
var events = require('events');
var util = require('util');
var Foo = (function(){
var foo = {};
events.EventEmitter.call(foo);
foo.init = function(){
foo.emit('bar');
};
util.inherits(parser, events.EventEmitter);
return {
bind: foo.init,
on: foo.on // I suppose this resolves to event emitter's on method
};
}());
module.exports = Foo;
然后,当我只是试着打电话时(比如在main.js中):
var foo = require('./foo.js');
foo.on('bar', function(){ ... });
在我打电话给foo.init();
之前会产生错误:
foo.on('bar', function(){ ... })
^
TypeError: Property 'on' of object #<Object> is not a function
当我选择以IIFE模式编码时,是否有可能从EventEmitter继承?或者我的错误与其他相关?
答案 0 :(得分:2)
如果你想保留这种模式,你有充分的理由不使用像这样的原型继承:
FooConstuctor.prototype = new events.EventEmitter();
然后,如果 EventEmitter 所需的全部是 on 方法,则只需添加:
Foo.on = events.EventEmitter.prototype.on;
创建 Foo 之后。
您只需在 Foo 上调用 EventEmitter 的构造函数,就无法在 Foo 上获取 方法因为 on 方法未附加到构造函数中的 EventEmitter 对象。
原因可能是在构造函数中为对象分配方法通常被认为是不好的做法,因为这样就为每个对象实例创建了一个新的函数 instance ,这通常是不必要的。浪费,并且这样创建的方法没有直接分配给原型,这可能会误导其他计划扩展“类”的开发人员。
答案 1 :(得分:2)
如果我需要一个具有模块模式的EventEmitter的对象,我更喜欢以下内容:
var foo = function () {
var ee = new EventEmitter();
/* custom logic */
return {
on: ee.on.bind(ee),
emit: ee.emit.bind(ee),
}
};