我正在尝试将 socket.io
分享到我的属性(property)中,但不确定为什么它不起作用...
我的第一个文件,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
谁知道有什么问题?
最佳答案
这里的问题是对作用域在 JavaScript 中的工作方式存在误解。当 router
调用 messageController.sendMessageAction
时,它使用一个绑定(bind)到它。例如:
callback(res, req, next)
在这种情况下,当前作用域不是 messageController
。所以 this
不引用 messageController
。如果您希望this
绑定(bind)到messageController
,您必须绑定(bind)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)
)
关于javascript - 原型(prototype)模式创建新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611731/