Создание объектов
Часть раздела Объектно-ориентированное программирование путешествия по 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(); // Только базовые функцииЭтот подход дает вам гибкость в комбинировании поведений без сложных цепочек наследования!
Задание
Завершите методы SmartBulb в файле SmartBulb.js.
- Реализуйте метод
activate(), чтобы включить свет. - Реализуйте метод
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);
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Объекты и ключевое слово this
Краткий обзор: ОбъектыДобавление методов в объектыПонимание ключевого слова thisФункции-конструкторыКлючевое слово newИтоговое испытание7Наследование и ключевое слово extends
НаследованиеОтношение «is-a»Ключевое слово extendsМетод super()Наследование свойств и методовИтоговое испытание10Полиморфизм
Что такое полиморфизм?Переопределение унаследованных методовИспользование superИтоговое задание13Композиция против наследования
Отношения «has-a» и «is-a»Ограничения глубокого наследованияСоздание объектов2Организация кода
Что такое модули?Экспорт с помощью exportИмпорт с помощью importDefault против именованных экспортов5Инкапсуляция и доступ
ИнкапсуляцияПубличные и приватные поля классовПриватные методыЗадание на повторение8Организация кода ООП
Организация классов в модули11Проект: Отрисовщик фигур
Настройка: Класс Shape и экспортНаследование класса Circle14Система управления библиотекой
Проектирование библиотекиКласс Book с использованием композиции6Проект: Простой банковский счет
Класс BankAccountПополнение и снятие средств9Статические методы и свойства
Уровень класса против уровня экземпляраСтатические свойстваСтатические вспомогательные методыЗадание на закрепление