ES6 Классы

ES6 представил поддержку классов (classes), которые представляют собой особый тип функций, однако вместо традиционного ключевого слова function для объявления методов и свойств теперь используется новое ключевое слово — class. Свойства объектов создаются и присваиваются внутри специального метода-конструктора constructor().

Простейший пример использования класса

Давайте рассмотрим простой класс Car, который представляет автомобильную марку:


// Определение класса Car
class Car {
  // Метод конструктор получает аргумент 'name'
  constructor(name) {
    // Присваиваем свойство brand значению аргумента 'name' через ссылку 'this'
    this.brand = name;
  }
}

Несколько важных моментов:

  • Имя класса начинается с заглавной буквы ("Car"). Такое написание является общепринятым соглашением JavaScript-сообщества для обозначения классов.

После определения класса можно создать объект данного типа с использованием оператора new.


Создание экземпляра класса

Чтобы использовать созданный класс, создаем новый экземпляр автомобиля следующим образом:


// Создаём объект mycar на основе класса Car
const mycar = new Car('Ford');

Что происходит?

  • Когда создаётся объект через оператор new, первым делом автоматически запускается метод-конструктор constructor().
  • Внутри метода-конструктора переменная this ссылается на создаваемый объект, позволяя устанавливать его свойства и методы.
  • В нашем примере передаётся строка "Ford" в качестве значения параметра name, которое будет присвоено свойству brand объекта.

Таким образом, после выполнения данного примера у нас будет объект с именем mycar, содержащий одно поле — brand, равное строке "Ford".

Результат работы приведённого выше кода выглядит так:


console.log(mycar); // Выведет { brand: 'Ford' }


Методы в классах JavaScript

JavaScript позволяет создавать классы, содержащие собственные методы. Метод — это функция, связанная с объектом определенного класса. Рассмотрим подробней процесс добавления методов в класс и работу с ними.

Добавление собственных методов в класс

Рассмотрим пример простого класса Car, который имеет один собственный метод:


// Создаем класс Car
class Car {
  // Конструктор принимает аргумент и присваивает значение полю brand
  constructor(name) {
    this.brand = name;
  }
  
  // Собственный метод present(), возвращающий строку
  present() {
    return 'I have a ' + this.brand;
  }
}

// Создание экземпляра класса Car
const mycar = new Car('Ford');

// Вызов метода через объект
console.log(mycar.present()); // Выводит: I have a Ford

Конструктор (constructor) — специальный метод, автоматически запускаемый при создании нового объекта. Здесь происходит инициализация свойств объекта.

Методы класса объявляются непосредственно внутри тела класса и имеют доступ ко всем полям текущего объекта через оператор this.

Для вызова метода используется следующий синтаксис:

  • Ссылка на экземпляр объекта.
  • Имя метода после точки.
  • Скобки (если нужно передать параметры):

mycar.present(); 


Наследование классов

Наследование — важная концепция ООП, позволяющая одному классу унаследовать свойства и поведение другого класса. Для реализации наследования используется ключевое слово extends:


// Родительский класс Car
class Car {
  constructor(name) {
    this.brand = name;
  }

  present() {
    return 'I have a ' + this.brand;
  }
}

// Класс-наследник Model
class Model extends Car { // Ключевое слово extends устанавливает связь между классами
  constructor(name, mod) {
    super(name);         // Вызов конструктора родительского класса
    this.model = mod;    // Инициализируем собственное свойство model
  }

  show() {
    return this.present() + ', it is a ' + this.model; // Используем метод родительского класса
  }
}

// Экземпляр класса Model
const mycar = new Model('Ford', 'Mustang');

// Вызов метода дочернего класса
console.log(mycar.show()); // Выводит: I have a Ford, it is a Mustang

Что здесь важно отметить?

  • Ключевое слово super(): оно вызывает конструктор родительского класса. Это позволяет использовать поля и методы базового класса.
  • Дочерний класс наследует все публичные методы и свойства родительского класса.
  • Мы можем переопределять или расширять функциональность базовых методов в классе-потомке.

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