2012-12-27 73 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);