Вираз класу

Вираз класу - це один зі способів визначити клас у ECMAScript 2015. Схоже до функціональних виразів, вирази класів можуть бути іменовані або неіменовані. У іменованих ім'я класу є локальним для використання тільки у тілі класу. Класи JavaScript використовують прототипне наслідування.

Синтаксис

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 Latest Draft (ECMA-262)
The definition of 'Class definitions' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
classChrome Full support 42Edge Full support 13Firefox Full support 45IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 42Chrome Android Full support 42Firefox Android Full support 45Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 4.0nodejs Full support 6.0.0
Full support 6.0.0
Full support 5.0.0
Disabled
Disabled From version 5.0.0: this feature is behind the --harmony runtime flag.

Legend

Full support  
Full support
No support  
No support
User must explicitly enable this feature.
User must explicitly enable this feature.

Див. також