2013-07-20 83 views
0

我有具體的問題有點繼承在JavaScript中,而不是Node.js的:的Node.js EventEmitter和iife模式

// 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 

難道就沒有可能繼承FR當我選擇以IIFE模式進行編碼時,EventEmitter?或者我的錯誤與其他相關?

回答

2

如果你想保持這種模式,你有沒有使用原型繼承這樣一個很好的理由:

FooConstuctor.prototype = new events.EventEmitter(); 

然後,如果你從EventEmitter需要的是方法,你可以再補充:

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

創建之後。

你不只是通過調用EventEmitter的構造富因爲方法不附着在構造EventEmitter對象得到方法

其原因可能是,它的通常被認爲是不好的做法,分配方法,在其構造你的對象,因爲那樣的話,一個新的功能實例爲每個創建的對象實例,它通常是不必要的浪費和方法像這樣創建的不是直接分配給原型,這可能會讓其他計劃擴展「類」的開發人員產生誤解。

+0

尼斯的解釋,但是,我要保持我的模式,以封裝和不提供所有我的功能馬上。 – px5x2

+0

由於這是用** 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), 
    } 

};