Объявление класса с точки зрения области видимости ведёт себя как let.
Имеют блочную область видимости
Не формируют свойство глобального объекта.
Не поднимаются.
Класс-родитель должен быть объявлен выше.
[extends Родитель] - может быть выражением, результатом которого должен быть класс или функция-конструктор.
Тело класса может содержать только методы, но не данные.
Причина того, что объявления классов не поднимаются заключается в том, что связь extends может содержать выражения, которые должны выполняться в соответствующее время.
constidentity=x=>x;// Here we are in the temporal dead zone of `MyClass`letinst=newMyClass();// ReferenceError// Note the expression in the `extends` clauseclassMyClassextendsidentity(Object) {}
Ограничение на подъем классов не такое радикальное. Можно ссылаться на класс до его объявления, но этот не должен выполняться:
Class expressions
Так же, как и Function Expression, классы можно задавать, в любом выражении и внутри вызова функции. Это называется Class Expression. У класса может быть опциональное имя, доступное только внутри класса:
function functionThatUsesBar() {
return new Bar();
}
functionThatUsesBar(); // ReferenceError
class Bar {}
functionThatUsesBar(); // OK
const MyClass = class Me {
getClassName() {
return Me.name;
}
};
let inst = new MyClass();
console.log(inst.getClassName()); // Me
console.log(Me.name); // ReferenceError: Me is not defined