В 2015 году стандарт ECMAScript 6 (ES6) ввел классы.
В JavaScript есть довольно необычный способ реализации наследования: прототипическое наследование. Прототипное наследование, хотя, на мой взгляд, и отличное, отличается от реализации наследования на большинстве других популярных языков программирования, основанной на классах.
Людям, работающим на Java, Python или других языках, было трудно понять тонкости наследования прототипов, поэтому комитет ECMAScript решил посыпать синтаксический сахар поверх наследования прототипов, чтобы это напоминало, как наследование на основе классов работает в других популярных реализациях.
Это важно: JavaScript под капотом все тот же, и вы можете получить доступ к прототипу объекта обычным способом.
Определение класса
Вот как выглядит класс.
class Person {
constructor(name) {
this.name = name
}
hello() {
return 'Hello, I am ' + this.name + '.'
}
}Класс имеет идентификатор, который мы можем использовать для создания новых объектов с помощью новый идентификатор класса() .
При инициализации объекта вызывается метод конструктор с любыми переданными параметрами.
Класс также имеет столько методов, сколько ему нужно. В этом случае hello является методом и может вызываться для всех объектов, производных от этого класса:
const flavio = new Person('Flavio')
flavio.hello()Наследование классов
Класс может расширять другой класс, и объекты, инициализированные с помощью этого класса, наследуют все методы обоих классов.
Если унаследованный класс имеет метод с тем же именем, что и один из классов выше в иерархии, приоритет имеет ближайший метод:
class Programmer extends Person {
hello() {
return super.hello() + ' I am a programmer.'
}
}
const flavio = new Programmer('Flavio')
flavio.hello()(вышеприведенная программа печатает ” Здравствуйте, я Флавио. Я программист. “)
Классы не имеют явных объявлений переменных класса, но вы должны инициализировать любую переменную в конструкторе.
Внутри класса вы можете ссылаться на родительский класс, вызывающий super() .
Статические методы
Обычно методы определяются в экземпляре, а не в классе.
Вместо этого в классе выполняются статические методы:
class Person {
static genericHello() {
return 'Hello'
}
}
Person.genericHello() //Hello
Частные методы
В JavaScript нет встроенного способа определения частных или защищенных методов.
Есть обходные пути, но я не буду описывать их здесь.
Добытчики и сеттеры
Вы можете добавлять методы с префиксом получить или установите для создания средства получения и установки, которые представляют собой два разных фрагмента кода, которые выполняются в зависимости от того, что вы делаете: доступ к переменной или изменение ее значения.
class Person {
constructor(name) {
this._name = name
}
set name(value) {
this._name = value
}
get name() {
return this._name
}
}Если у вас есть только средство получения, свойство не может быть установлено, и любая попытка сделать это (за пределами конструктора, который устанавливает значение при инициализации нового объекта с помощью этого класса) будет проигнорирована:
class Person {
constructor(name) {
this._name = name
}
get name() {
return this._name
}
}Если у вас есть только установщик, вы можете изменить значение, но не получить к нему доступ извне:
class Person {
constructor(name) {
this._name = name
}
set name(value) {
this._name = value
}
}Получатели и установщики очень полезны, когда вы хотите выполнить какой-либо код при изменении значения свойства или если вы хотите создать “вычисляемое” свойство. Вы можете изменить возвращаемые значения с помощью метода получения.
Вы также можете запустить некоторый код, например, войти в консоль или в файл при изменении значения.
Оригинал: “https://flaviocopes.com/javascript-classes/”