0

我有一个特定于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 继承?还是我的错误与其他有关?

4

2 回答 2

2

如果我需要一个像 EventEmitter 一样具有模块模式的对象,我更喜欢以下内容:

var foo = function () {

  var ee = new EventEmitter();

  /* custom logic */

  return {
    on: ee.on.bind(ee),
    emit: ee.emit.bind(ee),
  }

};
于 2013-07-20T23:05:51.920 回答
2

如果你想保持这种模式,并且你有充分的理由不使用这样的原型继承:

FooConstuctor.prototype = new events.EventEmitter();

然后,如果EventEmitter只需要on方法,则只需添加:

Foo.on = events.EventEmitter.prototype.on;

在您创建Foo之后。

您不能仅通过在Foo上调用EventEmitter的构造函数来获得Foo上的on方法,因为on方法未附加到构造函数中的EventEmitter对象。

其原因可能是通常认为在构造函数中为对象分配方法是不好的做法,因为这样会为每个对象实例创建一个新的函数实例,这通常是不必要且浪费的,而像这样创建的方法不是直接分配给原型,这可能会误导其他计划扩展您的“类”的开发人员。

于 2013-07-20T21:14:15.390 回答