ES6 классы

1. ES6 классы

JavaScript является единственным массовым языком программирования с наследованием, основанным не на классах, а на прототипах. Огромное число разработчиков, владеющих техникой использования классов, постоянно пытались переделать JavaScript под свои умения, а главное, под имеющиеся наработки в области ООП. В ES6 сделали шаг навстречу и ввели класс, похожий на таковой в языках Java, C# и т. п. Это все те же прототипы, только в красивой обертке.

2. Объявление класса

Класс — это удобный способ для задания конструктора вместе с прототипом.

Преимущества использования классов:

  • Весь код внутри класса выполняется в строгом режиме.

  • Все методы являются неперечислимыми.

  • У всех методов класса отсутствует внутренний метод [[Construct]], что означает появление ошибки при попытке использовать эти методы с оператором new.

  • Вызов конструктора класса без оператора new вызовет ошибку.

Предположим, мы запустили отель и хотим, чтобы объект со свойствами и методами представлял каждого гостя.

//class declaration
class Guest {
  //...
}

// Под капотом класс это функция-конструктор с прототипом
console.log(typeof Guest); // "function"
console.log(Guest.prototype); // {constructor: ƒ}

const guest = new Guest();
console.log(guest); // Guest {}
Copy

Как строить класс, зависит от того, что вам нужно. В нашем случае, класс представляет собой гостя отеля, поэтому мы добавим туда поля для имени и номера комнаты.

Класс использует аналог функции-конструктора — метод constructor. Это особый метод, он должен присутствовать в объявлении класса обязательно. Назначение конструктора — создавать собственные свойства экземпляра класса.

  • Функция constructor запускается при вызове new Guest, остальные методы записываются в Guest.prototype.

  • Свойство prototype класса доступно только для чтения, т.е. это свойство нельзя изменить.

  • В классе должен быть только один конструктор, иначе будет ошибка.

3. Методы

Добавим функцию getFullInfo. Функции, определенные таким образом, называться методами класса и доступны всем экземплярам через prototype.

4. Геттеры и сеттеры

Собственные свойства класса желательно хранить в constructor. Но существует и другой вариант — разместить в теле класса методы set и get. Эти методы используют особый синтаксис, а при их вызове, после имени объекта следует написать только имя геттера или сеттера без вызова функции, т.е. без круглых скобок.

5. Статические свойства и методы

Можно создавать собственные свойства класса и собственные методы класса для вызова по имени класса без создания объекта. Такие свойства и методы называют статическими. Для их создания в классе перед свойством или методом нужно добавить служебное слово static.

Конструктор класса тоже метод, но его нельзя делать статическим, это вызовет ошибку.

6. Наследование

JavaScript позволяет реализовать наследование классов. Это означает, что мы можем создавать новые классы, которые наследуют все от другого класса, но при этом добавляют уникальную информацию для себя.

Создадим базовый класс-родитель Animal от которого класс Dog будет наследовать.

При наследовании через extends формируется стандартная цепочка прототипов: методы Dog находятся в Dog.prototype, методы Animal в Animal.prototype и они связаны через __proto__.

Конструктор родителя наследуется автоматически. То есть, если в потомке не указан свой constructor, то используется родительский. Если же у потомка свой constructor, то чтобы в нём вызвать конструктор родителя, используется метод super() с аргументами для constructor родителя.

  • Вызвать конструктор родителя можно только изнутри конструктора потомка. В частности, super() нельзя вызвать из произвольного метода.

  • В конструкторе потомка мы обязаны вызвать super() до первого обращения к ключевому слову this. До вызова super() не существует this, так как по спецификации в этом случае именно super инициализирует this.

  • super() можно вызывать только в наследующем классе, иначе будет ошибка.

  • При наследовании, вызов конструктора родителя осуществляется через super(...args), вызов родительских методов через super.method(...args).

7. Дополнительные материалы

Last updated