В JavaScript класс — это схема или шаблон для создания объектов, тогда как объект — это экземпляр класса.

До появления синтаксиса класса ES6 (ECMAScript 2015) в JavaScript использовалось наследование на основе прототипов. Благодаря синтаксису классов ES6 JavaScript теперь имеет модель наследования на основе классов, аналогичную другим объектно-ориентированным языкам программирования, таким как Java или Python.

Объявление и выражение класса:

const Rectangle = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }

  get area() {
    return this.height * this.width;
  }
};

В этом примере мы определяем класс Rectangle с помощью выражения класса. Этот класс имеет метод constructor, который устанавливает свойства height и width объекта, и метод доступа get, который вычисляет площадь прямоугольника.

Метод конструктора:

Метод constructor — это специальный метод, который вызывается при создании объекта на основе класса. Он используется для инициализации свойств объекта. Вот пример:

class Circle {
  constructor(radius) {
    this.radius = radius;
  }

  get area() {
    return Math.PI * this.radius ** 2;
  }
}

const myCircle = new Circle(5);
console.log(myCircle.area); // Output: 78.53981633974483

В этом примере мы определяем класс Circle с методом constructor, который устанавливает свойство radius объекта. Затем мы создаем новый объект myCircle на основе этого класса и вычисляем его площадь с помощью аксессора area.

Статические методы:

Статические методы — это методы, которые вызываются в самом классе, а не в экземпляре класса. Они полезны для определения служебных функций или методов, которым не требуется доступ к свойствам объекта. Вот пример:

class MathUtils {
  static add(x, y) {
    return x + y;
  }

  static multiply(x, y) {
    return x * y;
  }
}

console.log(MathUtils.add(2, 3)); // Output: 5
console.log(MathUtils.multiply(2, 3)); // Output: 6

В этом примере мы определяем класс MathUtils с двумя статическими методами add и multiply. Затем мы вызываем эти методы для самого класса, а не для экземпляра класса.

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

JavaScript также поддерживает наследование между классами с помощью ключевого слова extends. Это позволяет вам создать подкласс, который наследует свойства и методы от родительского класса. Вот пример:

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} makes a noise.`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name} barks.`);
  }
}

const myDog = new Dog('Rover');
myDog.speak(); // Output: "Rover barks."

В этом примере мы определяем класс Animal с методом constructor и методом speak. Затем мы определяем класс Dog, который расширяет класс Animal и переопределяет метод speak. Мы создаем новый объект myDog на основе класса Dog и вызываем его метод speak.

Это всего лишь несколько примеров особенностей и возможностей классов в JavaScript. Классы предоставляют мощный и гибкий способ создания объектов с повторно используемым кодом и четкой иерархией наследования.