Создание классов в JavaScript: методы и способы наследования

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

JS
Скопировать код
class Figure {
  constructor(color) {
    this.color = color;
  }

  draw() {
    console.log('Рисую фигуру');
  }
}

const sketch = new Figure('red');
sketch.draw(); // Вывод: Рисую фигуру

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

Кинга Идем в IT: пошаговый план для смены профессии

Эксперименты с прототипами

JS
Скопировать код
function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  console.log(this.name + ' говорит: "Мууу..."');
}

const cow = new Animal("Burenka");
cow.speak(); // Буренка говорит: "Мууу..."

JavaScript предоставляет уникальную возможность использовать прототипное наследование. Благодаря этому, вы можете изменять прототипы классов даже после запуска кода, что расширяет возможности, но также может вызвать затруднения при неправильном использовании.

Замыкания для обеспечения приватности

JS
Скопировать код
function Car(maxSpeed) {
  let currentSpeed = 0;

  this.maxSpeed = maxSpeed;

  this.accelerate = function() {
    if (currentSpeed < maxSpeed) {
       currentSpeed++;
    }
    console.log(`Текущая скорость: ${currentSpeed} км/ч`);
  };
}

const car = new Car(180);
car.accelerate();

Замыкания позволяют скрыть внутренние данные функций, создавая "приватное" пространство для свойств. Это улучшает безопасность, но одновременно увеличивает затраты памяти, т.к. в каждом экземпляре хранятся уникальные функции.

Вдохновение из библиотек

JS
Скопировать код
// Пример расширения класса с использованием библиотеки Prototype
var Emu = Class.create(Bird, {
  initialize: function($super, name) {
    $super(name); // Вызов метода initialize класса Bird
  },

  run: function() {
    console.log(`${this.name} бежит с удивительной скоростью!`);
  }
});

Популярные библиотеки, такие как Prototype и jQuery, предоставляют средства для имитации классов и демонстрируют примеры их практического применения.

Знакомство с классами ES2015

JS
Скопировать код
const privateData = new WeakMap();

class Car {
  constructor(maxSpeed) {
    privateData.set(this, { speed: 0 });
    this.maxSpeed = maxSpeed;
  }

  accelerate() {
    let data = privateData.get(this);
    if (data.speed < this.maxSpeed) {
      data.speed++;
    }
    console.log(`Текущая скорость: ${data.speed} км/ч`);
  }
}

const auto = new Car(250);
auto.accelerate();

Со введением ES2015 ключевое слово class предлагает нам более краткий синтаксис для работы с классами и готовность к будущим обновлениям ECMAScript. Однако для поддержки всех браузеров в настоящее время потребуется использовать инструменты для транспиляции, такие как Babel.

Вне классов

JS
Скопировать код
const createRobot = name => ({
  name,
  speak() { console.log(`${this.name}: Бип-боп!`); }
});

const robot = createRobot("R2D2");
robot.speak(); // R2D2: Бип-боп!

Наконец, можно использовать такие методы, как фабричный метод, модульный паттерн и композицию объектов для создания объектов. Эти подходы дают определённые преимущества, но могут показаться нестандартными для тех, кто привык к классическому ООП.

Свежие материалы