Методы получения Javascript, похоже, не работают

avatar
An aspiring Scientist
1 июля 2021 в 19:56
48
2
0

Привет всем, я недавно начал работать с javascript и пытаюсь узнать о классах и объектах, но столкнулся с небольшой проблемой, которую не смог преодолеть, поэтому вот мой код

class bubbleSorter{
  constructor(/*params*/){
  //some fields
  }
  #bubbleSorter = () =>{
  //some code
  }

  getBubbleSorter = () =>{
    this.#bubbleSorter();
  }
}

let obj = new bubbleSorter(/*params*/);

console.log(obj.getBubbleSorter());

это пример моего кода. всякий раз, когда я пытаюсь зарегистрировать метод getter, он не совсем работает, но когда я вместо этого вызываю метод bubbleSorter -- предполагая, что я удаляю символ # -- он волшебным образом работает, я не знаю, почему это происходит, я попытался сделать доступным bubbleSorter, а затем вызвать его внутри getBubbleSorter все еще не работает

Источник
Barmar
1 июля 2021 в 19:58
0

Не используйте стрелочные функции в качестве методов класса.

evolutionxbox
1 июля 2021 в 19:59
0

@ Бармар, почему?

Barmar
1 июля 2021 в 20:00
0

Поскольку им не передается this, они сохраняют исходный this с момента их определения.

Keith
1 июля 2021 в 20:01
0

get bubbleSorter() { /*somecode*/ }

VLAZ
1 июля 2021 в 20:06
0

« всякий раз, когда я пытаюсь зарегистрировать метод получения, он не совсем работает », что вы имеете в виду? Ваш метод getBubbleSorter() ничего не возвращает, поэтому он всегда неявно выдает undefined. Это общее поведение для всех функций. Если ваш #bubbleSorter() должен возвращать значение, вам нужно return this.#bubbleSorter(); внутри getBubbleSorter(). Если это не так, вам нужно объяснить, что здесь означает «не работает».

An aspiring Scientist
1 июля 2021 в 20:11
0

@Barmar Это все еще не работает, хотя я изменил его на обычные функции.

VLAZ
1 июля 2021 в 20:13
0

@Barmar « они сохраняют исходное это, когда они были определены », что будет созданием объекта, поэтому this будет указывать на созданный экземпляр. В этом случае значения должны быть правильными. Если конструктор не заменит this на какой-то другой экземпляр. jsbin.com/qonudesalu/1/edit?js,console

Barmar
1 июля 2021 в 20:13
1

Пожалуйста, опубликуйте минимальный воспроизводимый пример и объясните, что должен делать код.

Barmar
1 июля 2021 в 20:14
0

@VLAZ Ах да. Связанный вопрос касается методов в объекте, а не методов в классах.

Ответы (2)

avatar
Alexander Kahoun
1 июля 2021 в 20:27
0

похоже, вы ничего не возвращаете в своем примере. Специально для

getBubbleSorter = () =>{
  this.#bubbleSorter();
}

Если вы измените его на

getBubbleSorter = () =>{
  return this.#bubbleSorter();
}

Я думаю, вы начнете получать то, что ожидаете. То, что ваш пример в настоящее время делает в конце, эквивалентно

console.log(() => {}());

сейчас он выполняет функцию, которая не имеет возвращаемого значения, поэтому выход из системы не определен. Как только вы добавите этот return выше, теперь вы будете регистрировать результат вашего частного геттера.

avatar
UnsignedByte
1 июля 2021 в 20:16
0

getBubbleSorter вызывает this.#bubbleSorter, но не возвращает значение, в результате чего функция возвращает undefined.