如何在此ES5类中访问父方法?

时间:2019-01-27 02:08:15

标签: node.js babel ecmascript-5

我在NodeJS中有一个Babel ES5类设置,例如:

import fs from "fs";

// Services
import { aws } from "../../services/aws";

class UserController {
    update(req, res, next) {
        const { user } = req.body;

        if (user) {
            req.user = Object.assign(req.user, user);

            req.user.save((err, updatedUser) => {
                if (err) {
                    return res.status(422).json(err);
                }

                return res.json({ user: updatedUser });
            });
        } else {
            return res.sendStatus(400);
        }
    }

    testMethod() {
        this.update();
    }
}

module.exports = new UserController();

如何从另一个父方法内部访问“更新”方法?在这种情况下很难看到“ this”的定义

2 个答案:

答案 0 :(得分:0)

使用this中显示的testMethod即可。

如果要确保正在调用模块导出的单例,可以保留实例并对其进行调用。

当然,如果您创建另一个实例,则此方法将崩溃。 对于您而言,您尚未导出类,因此无论如何,任何客户端都无法创建它。

const userController = new UserController()

// class definition here...

// In your class definition, use `userController` instead of `this`.
// For example

testMethod() {
    userController.update()
}

module.exports = userController;

答案 1 :(得分:0)

在JavaScript的class中创建方法时,this引用类本身的实例。因此,您可以通过class中的任何方法访问其中的所有定义。

类实际上只是带有语法糖的函数。 Check here for a thorough explanation of how classes work,包括this的用法。

您可以使用构造函数为类定义变量,如下所示:

class MyClass {
  constructor(name) {
    // setting a value on "this", which refers to the class object
    this.name = name;
  }

  printName() {
    // logging "this.name" which we set in the constructor
    console.log(this.name);
  }
}

const myObject = new MyClass("Michael");
myObject.printName(); // prints out "Michael"

看看this在构造函数和类方法中如何工作?

这些类方法实际上只是定义从构造函数分配给this的函数的简写。

使用您的示例,这是实际发生的情况:

class UserController {
  constructor() {
    this.update = function(req, res, next) {
      const { user } = req.body;

      if (user) {
          req.user = Object.assign(req.user, user);

          req.user.save((err, updatedUser) => {
              if (err) {
                  return res.status(422).json(err);
              }

              return res.json({ user: updatedUser });
          });
      } else {
          return res.sendStatus(400);
      }
    }

    this.testMethod = function() {
      this.update();
    }
  }
}