Классы в 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