我在构造函数中从一个类创建一个新对象,每当它运行时,我都会收到一个错误,指出操作在方法中未定义,尽管它是在构造函数中定义的。 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)
})
}
这感觉就像我缺少一些基本的东西。我听说这无论如何都不是一个很好的模式,所以请随时提出更好的方法。非常感谢。
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/