【问题标题】:es6 class methods can't reach this instancees6 类方法无法访问此实例
【发布时间】:2018-09-06 12:53:45
【问题描述】:

所以我创建了一个类,但不知道为什么我无法在一个方法中访问 this 实例。

所以在我的路由器中,我正在调用这样的方法

import Emails from '../controllers/emails'
import router from 'express'
....
route.post('/', Emails.setupEmail)

所以在调用POST 方法后它会调用setupEmail 方法但它会因消息而崩溃:

TypeError: 无法读取未定义的属性“availableEmailTypes”

以及类的代码:

class Emails {

constructor() {
    this.availableEmailTypes = ['registration', 'forgot-password', 'two-factor']
}

setupEmail(req, res) {
    if (!req.body.type || !req.body.type.include(this.availableEmailTypes)) {
        return res.status(422).send({ success: false, message: 'Invalid email type' })
    }

    switch (req.body.type) {
        case 'registration':
            break
    }
}

}

export default new Emails()

所以主要问题是为什么我无法访问在构造函数上创建的数组?

【问题讨论】:

  • 我可以强烈建议不要导出类的实例 (new Emails) 并使用班级名称(Emails)?!以后再谈如何让人们在阅读/维护代码时绊倒......(就此而言,如果你只想拥有一个实例,那么 Emails 类根本没有意义;只需使用一个对象。)
  • @T.J.Crowder 在说什么 + 如果您进行服务器端渲染,并且在某些时候有人决定在运行时更改该值,您最终会混合请求数据。

标签: javascript node.js ecmascript-6 this


【解决方案1】:

因为this 以及它是如何根据调用时上下文动态绑定的。当您调用Emails.setupEmail 时,其中的this 将不是您导出的Emails 实例。要么使用箭头函数来定义你的方法bind(Emails)当你调用它。

【讨论】:

  • 是的,有帮助,从没想过箭头功能在这样的地方会如此重要!
猜你喜欢
  • 2016-05-20
  • 2015-07-09
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多