Эта статья нуждается в редакционном обзоре.
Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.
Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.
Draft
This page is not complete.
Классы в JavaScript появятся в ECMAScript 6 и будут представлять собой синтаксический сахар существующих в языке прототипных наследований. Синтаксис класса не вводит новую объектно-ориентированную модель наследования. Классы в JS предоставляют гораздо более простой и понятный способ создания объектов.
Определение классов
На самом деле классы — это функции. Поэтому так же, как вы определяете функции (function expressions и function declarations), вы можете определять и классы с помощью:
Объявление класса
Первый способ определения класса — объявление класса (class declaration). Для этого необходимо воспользоваться ключевым словом class и указать имя класса (в примере — «Polygon»).
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Подъём (hoisting)
Разница между объявлением функции (function declaration) и объявлением класса (class declaration) в том, что объявление функции совершает подъём (hoisted), в то время как объявление класса — нет. Поэтому вначале необходимо объявить ваш класс и только затем работать с ним, а код же вроде следующего выбросит ошибку ReferenceError:
var p = new Polygon(); // ReferenceError
class Polygon {}
Выражение класса
Второй способ определения класса — выражение класса (class expression). С помощью него можно создавать именованные и безымянные классы. В первом случае имя класса находится в локальной области видимости класса.
// безымянный
var Polygon = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
// именованный
var Polygon = class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
Тело класса и метод определения
Тело класса — это часть кода, находящаяся в фигурных скобках ({ }). Здесь вы можете объявлять члены класса, такие как методы и конструкторы.
Строгий режим
Тела объявлений классов и выражений классов выполняются в строгом режиме (strict mode).
Constructor
Метод конструктор — специальный метод, необходимый для создания и инициализации объектов с помощью класса. В классе может быть только один конструктор. Ошибка SyntaxError будет выброшена, если класс будет содержать более одного метода конструктора.
Конструктор может использовать ключевое слово super для вызова конструктора родительского класса.
Статические методы
Ключевое слово static определяет для класса статический метод. Статические методы вызываются без инстанцирования класса и не могут быть вызваны у экземпляров класса. Статические методы часто используются для создания служебных функций для приложения.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.sqrt(dx*dx + dy*dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
console.log(Point.distance(p1, p2));
Наследование классов
Ключевое слово extends используется в объявлениях классов и выражениях классов для создания класса дочернего относительно другого класса.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
class Dog extends Animal {
speak() {
console.log(this.name + ' barks.');
}
}
Sub classing built-in objects
…
Обращения к родительскому классу
Ключевое слово super используется для вызова фунцкий на родителе объекта.
class Cat {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
class Lion extends Cat {
speak() {
super.speak();
console.log(this.name + ' roars.');
}
}
Сравнение синтаксиса наследования в ES5 и синтаксиса классов в ES6
…
Примеры
…
Спецификации
| Спецификация | Статус | КомментарийComment |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Class definitions' в этой спецификации. |
Стандарт | Initial definition. |
Поддержка в браузерах
| Функциональность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Основная поддержка | 42.0 | С февраля 2015 г. доступно на канале Nightly. Запланировано в версии 44. | ? | ? | ? |
| Функциональность | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
|---|---|---|---|---|---|---|
| Основная поддержка | Нет | Available in the Nightly channel only (since February 2015) | ? | ? | ? | 42.0 |

