Вызов метода из другого метода в том же классе

Почему я получаю сообщение об ошибке: "Uncaught TypeError: self.myTest не является функцией"? Как вызвать метод из другого метода в классе javascript?

class MyClass {

    myTest() {
      console.log('it works');
    }

    runMyTest() {
      self.myTest();
    }

}

var myClass = new MyClass();
myClass.runMyTest();

Ответ 1

Вам нужно использовать ключевое слово this вместо self.

runMyTest() {
    this.myTest();
}

Примечание стороны

Если вы вложенность стандартных функций обозначения, то this не лексический переплетен (будет определенно). Чтобы обойти это, используйте функции со стрелками (предпочтительно), .bind или локально определите this вне функции.

class Test {
  constructor() {
    this.number = 3;
  }

  test() {
    function getFirstThis() {
       return this;
    }

    const getSecondThis = () => {
       return this;
    };

    const getThirdThis = getFirstThis.bind(this);
    
    const $this = this;
    function getFourthThis() {
      return $this;
    }

    // undefined
    console.log(getFirstThis());
    
    // All return "this" context, containing the number property
    console.log(this); 
    console.log(getSecondThis());
    console.log(getThirdThis());
    console.log(getFourthThis());
  }
}

new Test().test();

Ответ 2

Вы должны использовать this не self, как

runMyTest() {
  this.myTest();
}

Однако многие реализации хотели бы сохранить ссылку и делают следующее:

var self = this;

Это может быть причиной того, что вы думаете о self как о себе. Для дальнейшего чтения я бы предложил этот SO - пост

Ответ 3

class MyClass {

    myTest() {
      console.log('it works');
    }

    runMyTest() {
      this.myTest();
    }

}

var myClass = new MyClass();
myClass.runMyTest();

Ответ 4

Другим решением является сохранение значения переменной context $this внутри другого, например, в this

и для использования это this.anyFunction();

class MyClass {
    myTest() {
      console.log('it works');
    }

    runMyTest() {
      let this=$this;
      this.myTest();
    }
}