继承Node.js的eventemitter失败

时间:2012-12-27 17:54:56

标签: node.js eventemitter

我正在尝试将事件监听器添加到我的类中,但它失败了,告诉我该对象没有'on'方法。

这是自己文件中的类:

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);

1 个答案:

答案 0 :(得分: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);