javascript - 来自未定义类的构造函数中的新对象

标签 javascript node.js ecmascript-6 babeljs es6-class

我在构造函数中从一个类创建一个新对象,每当它运行时,我都会收到一个错误,指出操作在方法中未定义,尽管它是在构造函数中定义的。 Operate 本身已经过全面测试,并且在单独的上下文中运行良好,所以这不是问题所在。我正在使用 Babel 构建它,不是直接在 Node 7.0.0 中运行它

import Operate from "./operate"

export default class {

  constructor(Schema) {
    this.schema = Schema
    this.operate = new Operate(this.schema)
    console.log(this.operate.run) // <- Logs just fine
  }

  update(req, res) {
    console.log(this.operate.run) // <- Nada
    this.operate.run(req.body)
      .then(value => {
        res.status(200).json(value)
      })
  }

enter image description here

这感觉就像我缺少一些基本的东西。我听说这无论如何都不是一个很好的模式,所以请随时提出更好的方法。非常感谢。

UPDATE:这是更新的使用方式。我不怀疑这里有任何问题,因为当我从另一个模块而不是类导入 Controller 作为函数时它工作得很好

import {Router, } from "express"
import Controller from "../controller"
import User from "./user.model"

let controller = new Controller(User)
let router = new Router()

router.post("/", controller.update)

module.exports = router

最佳答案

由此改变:

router.post("/", controller.update)

为此:

router.post("/", controller.update.bind(controller))

当您传递 controller.update 时,它只传递一个指向该方法的指针,并且与 controller 对象的任何关联都将丢失。然后,当稍后调用 update 方法时,没有与适当对象的关联,因此方法中的 this 处理程序是错误的,你会得到你看到的错误.

您可以在对象内强制绑定(bind) update 方法,或者当您在其他地方传递可能无法正确调用的方法时,您可以使用上述结构来传递该方法的绑定(bind)版本.

您还可以修改 update 方法的定义,通过将其添加到构造函数中,将其永久绑定(bind)到构造函数中的对象:

this.update = this.update.bind(this);

关于javascript - 来自未定义类的构造函数中的新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41798995/

相关文章:

javascript - JQuery 为文档就绪的嵌入字体提供了不正确的宽度

javascript - 在 node.js 中设置一个环境变量,然后在终端中使用它?

json - Node.js 中的正文解析不会转义请求正文中的换行符? JSON

javascript - 如何解构箭头符号中的参数

javascript - 使用 getter 和 setter 进行函数链接的方法

javascript - 从插件发送消息到表单不适用于空值

javascript - 如何在按钮提交之前验证数据?

javascript - 在 Google Jsapi 调用中是否必须使用开发人员 key ?

javascript - Node.js 忽略除第一个参数之外的所有查询字符串参数

JavaScript - Map() 增量值