node.js EventEmitter和iife模式

时间:2013-07-20 21:02:45

标签: javascript node.js inheritance eventemitter

我在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继承?或者我的错误与其他相关?

2 个答案:

答案 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),
  }

};