Как получить доступ к родительским методам внутри этого класса ES5? - PullRequest
0 голосов
/ 27 января 2019

У меня есть настройка класса Babel ES5 в NodeJS, например:

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();

Как получить доступ к методу update из другого родительского метода? Трудно понять, как в данном случае определяется «это»

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Когда вы создаете методы внутри class в JavaScript, this ссылается на экземпляр самого класса.Следовательно, вы можете получить доступ ко всем определениям в class из любого метода в нем.

Классы - это на самом деле просто функции с синтаксическим сахаром. Проверьте здесь для подробного объяснения того, какклассы работают , включая использование 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();
    }
  }
}
0 голосов
/ 27 января 2019

Использование 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;
...