ES6 классы
1. ES6 классы
JavaScript является единственным массовым языком программирования с наследованием, основанным не на классах, а на прототипах. Огромное число разработчиков, владеющих техникой использования классов, постоянно пытались переделать JavaScript под свои умения, а главное, под имеющиеся наработки в области ООП. В ES6 сделали шаг навстречу и ввели класс, похожий на таковой в языках Java, C# и т. п. Это все те же прототипы, только в красивой обертке.
2. Объявление класса
Класс — это удобный способ для задания конструктора вместе с прототипом.
Преимущества использования классов:
Весь код внутри класса выполняется в строгом режиме.
Все методы являются неперечислимыми.
У всех методов класса отсутствует внутренний метод
[[Construct]]
, что означает появление ошибки при попытке использовать эти методы с операторомnew
.Вызов конструктора класса без оператора
new
вызовет ошибку.
Предположим, мы запустили отель и хотим, чтобы объект со свойствами и методами представлял каждого гостя.
Как строить класс, зависит от того, что вам нужно. В нашем случае, класс представляет собой гостя отеля, поэтому мы добавим туда поля для имени и номера комнаты.
Класс использует аналог функции-конструктора — метод 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