【问题标题】:node.js EventEmitter and iife patternnode.js EventEmitter 和 iife 模式
【发布时间】:2013-07-20 21:02:44
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js inheritance eventemitter


    【解决方案1】:

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

    FooConstuctor.prototype = new events.EventEmitter();
    

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

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

    在您创建 Foo 之后。

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

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

    【讨论】:

    • 很好的解释,但是,我想保留我的模式以便封装而不是立即提供我的所有功能。
    • 因为这是用 Node.js 编写的,所以无论如何都没有局部变量会“泄漏”到全局范围,因此您不必担心。只有分配给 exports 属性的内容在模块外部可用。 Besisdes,我建议的解决方案考虑到您要保持这种模式并且不与它冲突。 (只有第二行代码是相关的)。
    【解决方案2】:

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

    var foo = function () {
    
      var ee = new EventEmitter();
    
      /* custom logic */
    
      return {
        on: ee.on.bind(ee),
        emit: ee.emit.bind(ee),
      }
    
    };
    

    【讨论】:

      猜你喜欢
      • 2012-05-03
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2021-12-30
      • 2021-10-26
      • 2012-02-12
      • 2014-10-09
      • 2021-10-17
      相关资源
      最近更新 更多