Классы JavaScript: доступ к методу из свойства функции объекта

#javascript #class #methods #jsobject

#javascript #класс #методы #jsobject

Вопрос:

Мне было интересно, возможно ли это, если кто-нибудь знает решение проблемы, с которой я столкнулся. Допустим, у нас есть следующий класс JavaScript:

 class foo {

    // Class Method.
    makeNoise() {
        console.log("bar");
    }

    // Class Object
    classObject = {
        makeASound: function() {
            makeNoise();
        }
    }
}
  

Теперь, если бы я должен был вызвать:

 var foo = new foo();
foo.classObject.makeASound();
  

Я бы получил сообщение об ошибке, в котором говорится, что makeNoise не определен. Использование ‘this.’ не сработало бы, потому что в этом контексте это привело бы к поиску функции внутри classObject и, следовательно, выдало бы ошибку ‘is not a function’. Существует ли вообще возможность доступа к makeNoise из функции объекта.

Ответ №1:

Вам нужно будет использовать функцию со стрелкой, чтобы избежать создания нового контекста, а затем использовать ключевое слово this , чтобы правильно получить доступ к makeNoise методу класса

 class Foo {
  makeNoise() {
    console.log("bar");
  }
  classObject = {
    makeASound: () => { // arrow function for lexical scope
      this.makeNoise(); // using `this` to refer to the Foo method
    },
  };
}
  

Вы также могли бы использовать Function.bind(), если предпочитаете

Ответ №2:

Попробуйте this.makeNoise()

 classObject = {
    makeASound: () => {
        this.makeNoise();
    }
}
  

Обновление: Если мы используем функцию со стрелкой для makeASound , мы можем сохранить нашу this привязку к родительскому классу. Гмайоло правильно понял это в своем ответе.

Комментарии:

1. Это приводит к той же ошибке, потому что function создает новый this