Объяснение
В JavaScript this
определяется при вызове функции. В вашем случае sound(a)
вызывается с контекстом this
undefined
.
если вы настаиваете на использовании this
внутри sound(a)
, есть два общих решения:
- использовать метод свойства класса ( функция стрелки ) вместо метода
- связывает контекст
this
в конструкторе
Первый подход был популяризирован React, и он работал нормально, потому что созданные пользователем компоненты React должны быть конечными классами. Однако, если вы занимаетесь объектно-ориентированным программированием и ожидаете, что ваш класс Cat
будет унаследован, вы не сможете использовать этот подход для , поскольку он нарушает наследование .
Решение
Свяжите контекст выполнения с экземпляром вашего класса в конструкторе.
class Cat {
constructor() {
this.sound = this.sound.bind(this)
this.meow("roar", this.sound)
}
meow(a, callback) {
callback(a)
}
sound(a) {
console.log(a)
console.log(this.sayMeow)
}
sayMeow() {
return "Meow"
}
}