“SyntaxError: super() is only valid in derived class constructors”

158
05 апреля 2019, 05:10

Не могу понять в чем проблема, подскажите пожалуйста

И еще, может ли кто-нибудь объяснить зачем нужно super? Зачем туда передаются аргументы?

class Animal { 
  constructor(name, voice) { 
    this.name = name; 
    this.voice = voice; 
  } 
   
  say() { 
    console.log(`${this.name} said ${this.voice}`); 
  } 
} 
 
class Bird extends Animal { 
  сonstructor(name, voice, canFly) { 
    super(name, voice); 
    this.canFly  = canFly; 
  } 
} 
 
const duck = new Bird('Dick', 'Crack'); 
 
duck.say(); 
duck.say();

Answer 1

В коде в вопросе, в классе Bird опечатка, первая буква c - не английская, что делает описанный метод, не конструктором, а обычным методом.

Если исправить - то ошибка использования super уйдет.

class Animal { 
  constructor(name, voice) { 
    this.name = name; 
    this.voice = voice; 
  } 
   
  say() { 
    console.log(`${this.name} said ${this.voice}`); 
  } 
} 
 
class Bird extends Animal { 
  constructor(name, voice, canFly) { 
    super(name, voice); 
    this.canFly  = canFly; 
  } 
} 
 
const duck = new Bird('Dick', 'Crack'); 
 
duck.say(); 
duck.say();

Для чего в этом случае нужно super?

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

Если его не вызывать, то на уровне языка решено было запретить обращаться к this, который указывает на создаваемый объект, так как он может быть не инициализированным.

Еще одним примером использования ключевого слова super может являться обращение к полям и методам базового класса, например:

class Animal { 
  constructor(name, voice) { 
    this.name = name; 
    this.voice = voice; 
  } 
 
  say() { 
    console.log(`${this.name} said ${this.voice}`); 
  } 
} 
 
class Bird extends Animal { 
  constructor(name, voice, canFly) { 
    super(name, voice); 
    this.canFly = canFly; 
  } 
  say() { 
    console.log('Bird say'); 
    super.say(); 
  } 
} 
 
const duck = new Bird('Dick', 'Crack'); 
 
duck.say(); 
duck.say();

Подробнее о super можно посмотреть в справке.

READ ALSO
Не добавлять уникальный объект [дубликат]

Не добавлять уникальный объект [дубликат]

На данный вопрос уже ответили:

123
Метод Extend для примесей.Не понятен фрагмент с “примешиванием” замыканий вызывающие методы примесей

Метод Extend для примесей.Не понятен фрагмент с “примешиванием” замыканий вызывающие методы примесей

Не пойму кусок кода из статьи про примеси(mixin),там где "примешивают" замыканияКонкретно в строках 1 и 2 не понятно что происходит?Ссылка на статью...

165
Вызов метода Nuxt из экземпляра класса

Вызов метода Nuxt из экземпляра класса

Сделал отдельным файлом конструктор класса с методами, его импортирую в компонент VueКак можно вызвать метод компонента Vue из класса, созданного...

139
использовать axios

использовать axios

Не работает axios пишет ошибку Cannot read property 'post' of undefined вот пример кода

213