EventEmitter
Node.jsクラスを使用する場合、複数レベルの継承への最適なアプローチを見つけようとしています。
セットアップは、基本コントローラーを持つことができるコントローラーを使用してNode.js用のMVCフレームワークを開発していますが、コントローラーはその基本コントローラーでも同じイベントを発行するイベントを発行できます。これまでのところ、私は持っています:
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');
…でも、「calling request event on homeController」しか出力されないので、両方の「 request 」イベントを発火させたい。どうすればいいですか?多分私は私のアプローチを完全に変える必要がありますか?
更新:みんなの助けに感謝します。Naor Biton が示唆したように、「prototype」プロパティはコンストラクター関数にのみ関係するため、baseController と homeController の間に継承はありませんでした。私は常にコンストラクター関数とオブジェクト インスタンスを混同しています。
私は最終的に次のことに落ち着きました:
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');