I'm trying to figure out the best approach to multiple levels of inheritance when using the Node.js EventEmitter
class.
The setup is I am developing an MVC framework for Node.js using Controllers that can have base Controllers, but Controllers can emit events that also emit the same event on its base Controller. So far I have:
var events = require('events');
var util = require('util');
var Controller = function() { };
util.inherits(Controller, events.EventEmitter);
var baseController = new Controller();
baseController.on('request', function() {
console.log('Calling request event on baseController');
});
var homeController = new Controller();
homeController.prototype = baseController;
homeController.on('request', function() {
console.log('Calling request event on homeController');
});
homeController.emit('request');
...but only "Calling request event on homeController" is output, I want both 'request' events to fire. How do I do this? Maybe I need to completely change my approach?
Update: thanks for everyone's help. As Naor Biton suggested, there was no inheritance between baseController and homeController because the 'prototype' property only matters for constructor functions. I'm always getting my constructor functions and object instances mixed up.
I eventually settled for the following:
var events = require('events');
var util = require('util');
var Controller = function() { };
util.inherits(Controller, events.EventEmitter);
Controller.createBaseController = function() {
var BaseController = function() { };
util.inherits(BaseController, Controller);
return new BaseController();
};
Controller.inheritController = function(baseController) {
var NewController = function() { };
NewController.prototype = baseController;
return new NewController();
};
var baseController = Controller.createBaseController();
baseController.on('request', function() {
console.log('Calling request event on baseController');
});
var homeController = Controller.inheritController(baseController);
homeController.on('request', function() {
console.log('Calling request event on homeController');
});
homeController.emit('request');