2012-12-27 35 views
0

我想添加事件偵聽器到我的類,但它失敗,告訴我對象沒有'on'方法。繼承Node.js的eventemitter失敗

下面是它自己的文件中的類:

var events = require('events'); 
var util = require('util'); 

var Motion = function Motion (app) { 

    events.EventEmitter.call(this); 

    // Load models 
    app.loadModel('motion', 'motion'); 

    this.on('testevent', function() { 
     console.log('an event has happened'); 
    }); 

    this.emit('testevent'); 

} 

util.inherits(Motion, events.EventEmitter); 

module.exports = Motion; 

這裏就是我如何實例化它:

var Motion = require('./plugins/motion.js'); 
var motion = new Motion(app); 
+0

你用什麼版本的node.js的?你的代碼在node.js v0.8.16上適合我。 –

回答

2

它看起來就像你可能會問的構造函數本身是一個事件發射。您的代碼使用構造函數生成new生成的對象。即在代碼片段末尾生成的對象motion應該有一個on方法(正如Vadim Baryshev所指出的那樣,如果這是您的意圖,您的代碼應該可以正常工作,並且如果是這種情況,您可以忽略其餘部分回答)。

如果你真的想要構造函數發出事件,那麼看看我提供給它的this questionthe answer。然而,這不是一個好的解決方案,而且如果不使用非標準的__proto__,似乎沒有辦法做到這一點。

更好的解決方案是爲構造函數製作一個單獨的事件發射器對象,用於排放。就像我喜歡構造函數模塊模式一樣,它必須被丟棄。許多節點模塊使模塊本身成爲發射器,並將模塊作爲構造函數公開。例如:

var events = require('events'); 
var util = require('util'); 

exports = module.exports = new events.EventEmitter(); 

exports.Motion = function (app) { 
    // Load models 
    app.loadModel('motion', 'motion'); 

    // Emit event 
    exports.emit('testevent'); 
}; 

和實例:

var motion = require('./plugins/motion'); 

motion.on('testevent', function() { 
    console.log('an object was constructed'); 
}); 

var motionObj = new motion.Motion(app);