Классы в JavaScript
Начиная с EcmaScript 6 в JavaScript появились классы.
Классы являются теми же объектами, с небольшой разницей
- имя класса всегда записывается с большой буквы,
- внутри класса описываются его методы. методы класса запятыми не разделяются,
- у каждого класса по умолчанию есть свойство constructor. в котором этот класс описывается,
- для каждого класса можно создавать объекты этого класса
Пример кода
class Human {
constructor(name, lastName) {
this.name = name;
this.lastName = lastName;
}
get() {
return this.name + " " + this.lastName;
}
}
const human = new Human("Peter", "Ivanov");
human.get() // "Peter Ivanov"
Конструктор не обязателен
class Human {
get(name, lastName) {
return name + " " + lastName;
}
}
const human = new Human();
human.get("Peter", "Ivanov") // "Peter Ivanov"
Классы позволяют наследовать созданные с их помощью методы.
Создадим класс калькулятор – Calc:
class Calc {
sum(a, b) {
return a + b;
}
dif(a, b) {
return a - b;
}
mul(a, b) {
return a * b;
}
div(a, b) {
return a / b;
}
}
const calc = new Calc();
calc.sum(2, 4) // 6
Предположим, мы хотим создать квадратичный калькулятор, который полученные результаты действий будет возводить в квадрат. Можно переписать код полностью и внести в него необходимые изменения, но дублирование кода не есть хорошо. Можно поступить иначе.
Создаём класс SqrCalc и передаём ему все методы класса Calc
class SqrCalc extends Calc {
}
const sqrCalc = new SqrCalc();
sqrCalc.mul(2, 4)
У класса SqrCalc нет метода mul(), у него на данный момент вообще ни одного метода нет. Но он наследует методы класса Calc и может их использовать.
Но класс SqrCalc мы создавали не для того, чтобы просто продублировать методы Calc, а чтобы их изменить. Как это сделать.
class SqrCalc extends Calc {
sum(a, b) {
const res = super.sum(a, b);
return res * res;
}
}
const sqrCalc = new SqrCalc();
sqrCalc.sum(2, 4) // 36
Задачи на классы
https://www.codewars.com/kata/56f7f8215d7c12c0e7000b19
https://www.codewars.com/kata/56f935002e6c0d55fa000d92
https://www.codewars.com/kata/56fbdda707cff41b68000de2