原型模式创建新属性

Prototype pattern create new property

本文关键字:属性 新属性 模式 创建 原型      更新时间:2023-09-26

我正在尝试将socket.io共享到我的财产,不知道为什么它不起作用...

我的第一个文件,MessageController.js

function MessageController() {
};
MessageController.prototype.io = "";
MessageController.prototype.sendMessageAction = function (req, res) {
    console.log(this.io);
}
module.exports = new MessageController();

在另一个文件中router.js我有这样的:

var messageController = require('./controllers/MessageController');

module.exports = function (expressApp, router, io) {
    console.log(io); 
   messageController.io = io;
    router.post('/dashboard/message', messageController.sendMessageAction);
    return router;
};

以下是我要求router.js的方式:

module.exports = function (expressApp, io) {
    var router = system.express.Router();
    router = require('./dashboard/router.js')(expressApp, router, io);
    return router;

};

当我调用路线this.io财产返回时undefined有人知道问题是什么?

这里的问题是对 scope 在 JavaScript 中如何工作的误解。当router调用messageController.sendMessageAction时,它会使用绑定。例如:

callback(res, req, next)

在这种情况下,当前范围不是 messageController .所以this不是指messageController.如果要将this绑定messageController则必须sendMessageAction绑定到它。

// Using Function#bind
router.post(
  '/dashboard/message',
  messageController.sendMessageAction.bind(messageController)
)
// Using a closure
router.post(
  '/dashboard/message',
  (req, res) => messageController.sendMessageAction(req, res)
)