Вираз класу - це один зі способів визначити клас у ECMAScript 2015. Схоже до функціональних виразів, вирази класів можуть бути іменовані або неіменовані. У іменованих ім'я класу є локальним для використання тільки у тілі класу. Класи JavaScript використовують прототипне наслідування.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
var MyClass = class [className] [extends] {
// тіло класу
};
Опис
Вираз класу має синтаксис, подібний до синтаксису оголошення (оператору) класу. Однак, у виразі класу ви можете опустити ім'я класу ("зв'язуючий ідентифікатор"), чого не можна зробити у оголошенні класу. Додатково, вираз класу дозволяє перевизначити/переоголосити клас та не викинути жодних помилок типу, як у оголошенні класу. Конструктор є необов'язковою властивістю. А результатом typeof для класів, створених за допомогою ключового слова, завжди буде "function".
Як і у оголошенні класу, тіло класу у виразі класу виконується у строгому режимі.
'use strict';
var Foo = class {}; // конструктор є необов'язковою властивістю
var Foo = class {}; // дозволяється перевизначення
typeof Foo; //вертає "function"
typeof class {}; //вертає "function"
Foo instanceof Object; // true
Foo instanceof Function; // true
class Foo {}; // Викидає TypeError, не дозволяє перевизначення
Приклади
Простий вираз класу
Це простий анонімний вираз класу, на який можна посилатись через змінну "Foo".
var Foo = class {
constructor() {}
bar() {
return 'Привіт!';
}
};
var instance = new Foo();
instance.bar(); // "Привіт!"
Foo.name; // "Foo"
Іменовані вирази класів
Якщо ви бажаєте звертатись до поточного класу всередині тіла класу, ви можете створити іменований вираз класу. Це ім'я видиме тільки в області видимості самого виразу класу.
var Foo = class NamedFoo {
constructor() {}
whoIsThere() {
return NamedFoo.name;
}
}
var bar = new Foo();
bar.whoIsThere(); // "NamedFoo"
NamedFoo.name; // ReferenceError: NamedFoo is not defined
Foo.name; // "NamedFoo"
Специфікації
| Специфікація | Статус | Коментар |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Class definitions' in that specification. |
Standard | Початкове визначення. |
| ECMAScript 2016 (ECMA-262) The definition of 'Class definitions' in that specification. |
Standard | |
| ECMAScript 2017 (ECMA-262) The definition of 'Class definitions' in that specification. |
Standard | |
| ECMAScript (ECMA-262) The definition of 'Class definitions' in that specification. |
Living Standard |
Сумісність з веб-переглядачами
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
class | Chrome Full support 42 | Edge Full support 13 | Firefox Full support 45 | IE No support No | Opera Full support 29 | Safari Full support 7 | WebView Android Full support 42 | Chrome Android Full support 42 | Firefox Android Full support 45 | Opera Android Full support 29 | Safari iOS Full support 7 | Samsung Internet Android Full support 4.0 | nodejs
Full support
6.0.0
|
Legend
- Full support
- Full support
- No support
- No support
- User must explicitly enable this feature.
- User must explicitly enable this feature.