Атрибуты класса JS возвращают неопределенные значения с помощью методов получения конструктора/набора

#javascript

Вопрос:

Этот класс JavaScript не устанавливает атрибуты с помощью конструктора. По какой-то причине они выглядят так undefined . Я действительно в замешательстве, потому что, если я выну методы set/get , это сработает, но с методами set/get возвращается имя/род undefined .

 class Animal {  constructor(genus, name){  this.name = name;  this.genus = genus;  }    // called when setting this.name (i.e. this.name = value)  set name(name){  console.log("you set name");  }    // Called when getting this.name  get name(){  console.log("you got name");  }    // Called when setting this.name (i.e. this.genus = value)  set genus(genus){  console.log("you set genus");  }    // called when getting this.genus  get genus(){  console.log("you got genus");  }    makeNoise(noise = ""){  console.log(noise);  }    // Class method  static _repr(){  return "Animal Class";  } }  
 gt; let cat = new Animal("Feline", "Daisy"); you set name you set genus undefined gt; cat Animal {} gt; cat.name you got name undefined gt; cat.genus you got genus undefined  

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

1. Ух, твои добытчики ничего не return делают?

Ответ №1:

Когда вы делаете this.name = name это в конструкторе, вы вызываете сеттер. Если вы хотите сохранить значение, переданное в аргументах конструктора, а также сохранить значение, когда свойства назначены внешним (например animal.name = 'foo' ), вам потребуется

  • Используйте другое имя свойства для внутреннего хранения данных — что-то другое , чем name то же имя свойства, что и у получателя/установщика
  • Исправьте методы получения и настройки, чтобы получить и установить это внутреннее свойство
 class Animal {  constructor(genus, name) {  this._name = name;  this._genus = genus;  }  set name(name) {  console.log('setter invoked');  this._name = name;  }  get name() {  console.log('getter invoked');  return this._name;  }  set genus(genus) {  this._genus = genus;  }  get genus() {  return this._genus;  } }  const a = new Animal('gen1', 'name1'); console.log(a.name); a.name = 'name2'; console.log(a.name); 

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

1. Таким образом, в основном, префиксируйте атрибуты класса _ , чтобы избежать запуска функций set/get.

Ответ №2:

Ваши методы get должны фактически возвращать значения. Вы получаете неопределенное значение, потому что все, что делают получатели, — это ведение журнала консоли.

Например:

 get genus(){  console.log("you got genus");  return this.genus; }  

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

1. Я пытался возвращать значения в методах set/get, но это продолжало делать бесконечный цикл. Но на самом деле я думаю, что теперь, когда я смотрю на это, я понимаю, в чем была моя проблема

2. Разве этот код не будет выполнять бесконечный цикл? this.genus звонки get genus() , которые возвращаются this.genus , и так далее.

3. Ответ CaptainPerformance подтверждает это — хотя вы правы насчет бесконечного цикла! Обычно вы создаете экземпляр в конструкторе, чтобы this._genus , и получатель будет вызван genus и т. Д.