Код выдает ошибку в классе почему?

230
04 августа 2021, 14:20

function f(phrase) { 
  return class { 
    sayHi() { console.log(phrase) } 
  } 
} 
 
class User extends f("Привет") {} 
 
new User().sayHi();

  1. Код не выдаст ошибку

function f(phrase) { 
  return class { 
    sayHi() { alert(phrase) } 
  } 
} 
 
class User extends f("Привет"); 
 
new User().sayHi();

  1. Код выдаст ошибку
  2. Почему ?
Answer 1

extends является частью определения класса.

ClassDeclaration[Yield, Await, Default]:
    class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await]

где ClassTail имеет следующую структуру

ClassTail[Yield, Await]:
    ClassHeritage[?Yield, ?Await]opt { ClassBody[?Yield, ?Await]opt }

Отсюда видно, что обязательно указывать тело класса, как минимум пустым блоком.

При этом extend указан в ClassHeritage

ClassHeritage[Yield, Await]:
    extends LeftHandSideExpression[?Yield, ?Await]

Если применить к примеру в вопросе

class User extends f("Привет") {}

ClassHeritage - extends f("Привет") и далее должно следовать тело класса.

Так как во втором случае тела нет появляется ошибка.

READ ALSO
Как связать select и input text

Как связать select и input text

Есть примерно такая структураКак можно сделать,чтобы выбор option прописывался в input? Допустим,стоит инпут,возле него селект,допустим,пользователь...

201
Проблема с асинхронностью

Проблема с асинхронностью

Всем приветЕсть такой код:

244