gpt4 book ai didi

javascript - Node.js EventEmitter 和多级继承

转载 作者:搜寻专家 更新时间:2023-10-31 23:10:00 25 4
gpt4 key购买 nike

我正在尝试找出使用 Node.js EventEmitter 类时实现多级继承的最佳方法。

设置是我正在使用 Controller 为 Node.js 开发一个 MVC 框架, Controller 可以有基础 Controller ,但 Controller 可以发出事件,这些事件也会在其基础 Controller 上发出相同的事件。到目前为止,我有:

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

...但只输出“在 homeController 上调用请求事件”,我希望触发两个“请求”事件。我该怎么做呢?也许我需要彻底改变我的方法?


更新:感谢大家的帮助。正如 Naor Biton 所建议的那样,baseController 和 homeController 之间没有继承关系,因为“原型(prototype)”属性只对构造函数有影响。我总是把我的构造函数和对象实例搞混了。

我最终解决了以下问题:

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

最佳答案

在您的示例中,homeControllerbaseController 之间没有继承关系。此外,这一行:

homeController.prototype = baseController;

是多余的,因为原型(prototype)属性只对构造函数有影响。

如果你想设置 baseController 以便扩展/继承它的任何人都将分配给它的“请求”监听器,首先你应该这样定义它:

var BaseController = function(){
this.on('request', function(){
console.log('...');
});
};

BaseController.prototype = new events.EventEmitter();
BaseController.prototype.constructor = BaseController;

如果可以在初始化方法中分配处理程序,那就更好了(在构造函数中工作通常是糟糕的设计):

var BaseController = function(){};

BaseController.prototype = new events.EventEmitter();
BaseController.prototype.init = function(){
this.on('request', function(){
console.log('...');
});
};

然后,您只需在 HomeController 中扩展它即可:

var HomeController = function(){};
HomeController.prototype = new BaseController();

var homeController = new HomeController();
homeController.init(); // If you went with the initialization approach I offered...

请注意,除非您必须这样做,否则在 JS 中创建长继承链不是很好或难以维护。如果可以,我鼓励您避免这样做,并尝试寻找更易于维护的解决方案。

关于javascript - Node.js EventEmitter 和多级继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17772451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com