原型模式创建新属性

时间:2016-11-15 14:00:04

标签: javascript node.js express

我正在尝试与我的财产分享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时,任何人都知道什么是问题?

1 个答案:

答案 0 :(得分:1)

这里的问题是对JavaScript的范围如何工作的误解。当router调用messageController.sendMessageAction时,它会使用绑定。 e.g:

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