Принципы ООП в JavaScript

RedDeveloper
30.03.2023 12:39
Принципы ООП в JavaScript

Парадигма объектно-ориентированного программирования имеет 4 основных принципа,

  • Инкапсуляция
  • Абстрагирование
  • Наследование
  • Полиморфизм

Инкапсуляция

Используется для сокрытия данных.

В следующем примере класс Movie имеет два приватных свойства,

  • _title
  • _логи

Но эти свойства скрыты и могут быть получены или установлены только с помощью методов getter и setter.

class Movie {
    private _title: string;
    private _logs: Array<string>;
    constructor(title = '') {
        this._title = title;
        this._logs = [];
    }
    public get title() {
        this._logs.push(`Getting title: ${this._title}`);
        return this._title;
    }
    public set title(title: string) {
        this._logs.push(`Setting title to: ${title}`);
        this._title = title;
    }
    public get logs() {
        return this._logs;
    }
}
const movie = new Movie();
movie.title = 'Aguner Porosmoni';
console.info(movie.title);
console.info(movie.logs); // ["Setting title to: Aguner Porosmoni", "Getting title: Aguner Porosmoni"]

// If we directly try to access the properties like `_title` or `_logs`, like below, throws an error
// Property '_title' is private and only accessible within the class 'Movie'.
// movie._title = 'Aguner Porosmoni';

В данном случае доступ к title не осуществляется напрямую, вместо этого нам нужно использовать getter и setter, которые доступны снаружи, чтобы взаимодействовать со свойством title.

Абстракция

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

Например, нажатие на педаль газа в автомобиле увеличивает скорость. Для водителей нет необходимости раскрывать, как газ расходуется двигателем и внутренним механизмом.

class Circle {
  constructor(radius = 0) {
    this.radius = radius;
    this.pi = 3.14;
  }
  getArea() {
    return this.pi * Math.pow(this.radius, 2);
  }
}

Здесь мы передаем радиус и вызываем getArea, чтобы получить площадь круга. Абстракция скрывает, как происходит вычисление площади.

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

Наследование дает возможность создать новый класс на основе существующего класса. Этот новый класс может получить доступ ко всем неприватным свойствам существующего класса.

Например, у нас есть класс Shape. Мы можем создать новый класс под названием Square из класса Shape.

Наследование может быть,

  • одиночное наследование (FuelCar наследует класс Vehicle)
  • Множественное наследование (HybridCar наследует классы ElectricCar и FuelCar)
  • Многоуровневое наследование (GasolineCar наследует FuelCar и FuelCar наследует класс Vehicle)
  • Иерархическое наследование (И FuelCar, и ElectricCar наследуют )
  • Гибридное наследование

Полиморфизм

Полиморфизм позволяет вызывать методы с разными сигнатурами.

Это может быть

  • Переопределение метода
  • Перегрузка метода

В следующем примере мы переопределяем метод под названием multiply. И родительский класс, и дочерний класс имеют один и тот же метод, но с разными параметрами. Когда мы передаем 3 параметра, это обрабатывается объектом childClass. Для двух параметров вызывается объект ParentClass.

class ParentClass {
  multiply(a, b) {
    console.info(a * b);
  }
}
class ChildClass extends ParentClass {
  multiply(a, b, c) {
    // super.multiply(a, b);
    console.info(a * b * c);
  }
}
const parent = new ParentClass();
const child = new ChildClass();
parent.multiply(2, 3); // 6
child.multiply(2, 3, 4); // 24

Для перегрузки методов мы можем рассмотреть следующий пример. У нас есть метод getArea, который может принимать одинарный или двойной параметр. Если мы получаем и высоту, и ширину, мы возвращаем height * width. В противном случае, если только высоту, возвращаем height * height.

class Shape {
  getArea(height, width = -1) {
    if (width === -1) {
      return height * height;
    }
    return height * width;
  }
}
const shape = new Shape();
shape.getArea(5); // 25
shape.getArea(5, 6); // 30

Абстракция и инкапсуляция

  • Абстракция - это уровень проектирования, инкапсуляция - уровень приложения.
  • Абстракция скрывает ненужные данные, а инкапсуляция ограничивает доступ для предотвращения злоупотреблений
  • Абстракция использует интерфейс и абстрактный класс для сокрытия данных, а инкапсуляция использует геттер и сеттер для предотвращения прямого доступа

Ресурсы

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2026-2027 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.