Menu
Coddy logo textTech

Создание объектов

Часть раздела Объектно-ориентированное программирование путешествия по JavaScript на Coddy — урок 49 из 56.

Теперь, когда мы понимаем проблемы глубокого наследования и отношения «has-a», давайте узнаем, как создавать объекты путем объединения небольших, переиспользуемых компонентов. Этот подход дает нам максимальную гибкость! 

Базовый шаблон:

// Шаг 1: Создайте небольшие, специализированные компоненты
class Engine {
  constructor(power) {
    this.power = power;
  }
  
  start() {
    console.log(`Engine (${this.power}HP) starting...`);
  }
}

class Wheels {
  constructor(count) {
    this.count = count;
  }
  
  rotate() {
    console.log(`${this.count} wheels rotating`);
  }
}
// Шаг 2: Создание объектов путем объединения компонентов
class Car {
  constructor(brand, enginePower, wheelCount) {
    this.brand = brand;
    this.engine = new Engine(enginePower);    // ИМЕЕТ двигатель (отношение HAS-A)
    this.wheels = new Wheels(wheelCount);     // ИМЕЕТ колеса
  }
  
  drive() {
    console.log(`${this.brand} is driving:`);
    this.engine.start();
    this.wheels.rotate();
  }
}
// Шаг 3: Использование составного объекта
const myCar = new Car('Toyota', 150, 4);
myCar.drive();
// Вывод:
// Toyota is driving:
// Engine (150HP) starting...
// 4 wheels rotating

Настоящая мощь: комбинирование компонентов:

// Более специализированные компоненты
class TurboCharger {
  boost() {
    console.log('Turbo engaged! Extra power!');
  }
}

class SoundSystem {
  constructor(type) {
    this.type = type;
  }
  
  playMusic() {
    console.log(`Playing music on ${this.type} sound system`);
  }
}
// Создание различных автомобилей с разными комбинациями
class SportsCar {
  constructor(brand) {
    this.brand = brand;
    this.engine = new Engine(300);
    this.wheels = new Wheels(4);
    this.turbo = new TurboCharger();      // Спортивный автомобиль получает турбонаддув
    this.soundSystem = new SoundSystem('Premium'); // И хорошую аудиосистему
  }
  
  raceMode() {
    console.log(`${this.brand} in race mode:`);
    this.engine.start();
    this.turbo.boost();
    this.wheels.rotate();
    console.log('VROOOOM!');
  }
  
  cruise() {
    console.log(`${this.brand} cruising:`);
    this.engine.start();
    this.wheels.rotate();
    this.soundSystem.playMusic();
  }
}
class EconomyCar {
  constructor(brand) {
    this.brand = brand;
    this.engine = new Engine(100);
    this.wheels = new Wheels(4);
    // Нет турбо для эконом-автомобиля
    this.soundSystem = new SoundSystem('Basic'); // Только базовая аудиосистема
  }
  
  drive() {
    console.log(`${this.brand} driving efficiently:`);
    this.engine.start();
    this.wheels.rotate();
    this.soundSystem.playMusic();
  }
}
// Посмотрите, насколько это гибко!
const ferrari = new SportsCar('Ferrari');
const honda = new EconomyCar('Honda');

ferrari.raceMode();  // Есть турбо-ускорение!
ferrari.cruise();    // Есть премиальный звук!

honda.drive();       // Только базовые функции

Этот подход дает вам гибкость в комбинировании поведений без сложных цепочек наследования!

challenge icon

Задание

Завершите методы SmartBulb в файле SmartBulb.js.

  1. Реализуйте метод activate(), чтобы включить свет.
  2. Реализуйте метод adjustBrightness(), чтобы установить яркость и вывести в консоль точно: Brightness set to ${this.brightness.level}%

Шпаргалка

Объекты можно создавать путем объединения небольших, повторно используемых компонентов вместо использования глубокого наследования. Это называется композицией и следует принципу отношения «имеет» (has-a).

Базовый паттерн композиции:

// Шаг 1: Создание небольших, специализированных компонентов
class Engine {
  constructor(power) {
    this.power = power;
  }
  
  start() {
    console.log(`Engine (${this.power}HP) starting...`);
  }
}

// Шаг 2: Создание объектов путем объединения компонентов
class Car {
  constructor(brand, enginePower) {
    this.brand = brand;
    this.engine = new Engine(enginePower);  // ИМЕЕТ двигатель (HAS-A)
  }
  
  drive() {
    this.engine.start();
  }
}

Смешивайте и сочетайте компоненты для гибкости:

class TurboCharger {
  boost() {
    console.log('Turbo engaged!');
  }
}

class SportsCar {
  constructor(brand) {
    this.brand = brand;
    this.engine = new Engine(300);
    this.turbo = new TurboCharger();  // Добавление компонента турбонаддува
  }
  
  raceMode() {
    this.engine.start();
    this.turbo.boost();
  }
}

class EconomyCar {
  constructor(brand) {
    this.brand = brand;
    this.engine = new Engine(100);
    // Нет компонента турбонаддува
  }
}

Композиция позволяет создавать объекты с различными комбинациями функций без сложных цепочек наследования.

Попробуйте сами

import { SmartBulb } from './SmartBulb.js';

const bedroomLight = new SmartBulb('warm white');

console.log('1. Activating light:');
bedroomLight.activate();

console.log('\n2. Adjusting brightness:');
bedroomLight.adjustBrightness(75);
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование