javascript - 原型(prototype)模式创建新属性

标签 javascript node.js express

我正在尝试将 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/

相关文章:

javascript - Javascript 读取 ASP 列表框

javascript - Angular2 快速入门 - 'Cannot Get' 消息

javascript - NodeJS MongoDB 动态查询

javascript - Express 中的服务器端验证与单页 Angular 应用程序兼容

用于检查 URL 内容并只保留一件事的 Javascript 代码

javascript - 如何像加载网页一样发推特

node.js - 如何查找集合中 ID 位于数组中的项目?

Node .js : redirecting urls from http to https working well with all my urls except one

reactjs - 为什么我总是收到不允许通配符 * 的 cors 错误,尽管我在服务器上指定了一个来源?

javascript - 如何通过 jQuery 运行 php 文件向管理员发送电子邮件