#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
и т. Д.