ООП в JavaScript

Объекты в JavaScript

Объекты являются основными строительными блоками в JavaScript. Объект — это коллекция пар "ключ-значение", где значения могут быть любыми типами данных.


// Пример создания объекта
let person = {
    name: "John",
    age: 30,
    greet: function() {
        console.log("Привет, меня зовут " + this.name);
    }
};

person.greet(); // Привет, меня зовут John
            

Классы в JavaScript

Классы были добавлены в JavaScript с ES6 и представляют собой удобный способ создания объектов и реализации ООП-концепций. Класс определяет тип объекта, а экземпляры класса создаются с помощью ключевого слова new.


// Пример создания класса
class Animal {
    constructor(name, species) {
        this.name = name;
        this.species = species;
    }

    speak() {
        console.log(`${this.name} говорит: Привет!`);
    }
}

let dog = new Animal("Рекс", "Собака");
dog.speak(); // Рекс говорит: Привет!
            

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

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


// Пример наследования
class Animal {
    constructor(name) {
        this.name = name;
    }

    speak() {
        console.log(`${this.name} издает звук.`);
    }
}

class Dog extends Animal {
    speak() {
        console.log(`${this.name} лает.`);
    }
}

let rex = new Dog("Рекс");
rex.speak(); // Рекс лает.
            

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

Инкапсуляция — это принцип, который скрывает внутреннюю реализацию объекта и предоставляет доступ к данным через методы. В JavaScript инкапсуляция реализуется с помощью приватных свойств и методов.


// Пример инкапсуляции
class Counter {
    #count = 0; // Приватное свойство

    increment() {
        this.#count++;
        console.log(this.#count);
    }

    getCount() {
        return this.#count;
    }
}

let counter = new Counter();
counter.increment(); // 1
console.log(counter.getCount()); // 1
            

Полиморфизм

Полиморфизм позволяет использовать единый интерфейс для работы с разными типами объектов. В JavaScript это достигается за счет переопределения методов в подклассах.


// Пример полиморфизма
class Animal {
    speak() {
        console.log("Животное издает звук.");
    }
}

class Dog extends Animal {
    speak() {
        console.log("Собака лает.");
    }
}

class Cat extends Animal {
    speak() {
        console.log("Кошка мяукает.");
    }
}

let animals = [new Dog(), new Cat()];

animals.forEach(animal => {
    animal.speak();
});
// Собака лает.
// Кошка мяукает.
            

Абстракция

Абстракция — это концепция, которая фокусируется на важных характеристиках объекта, игнорируя несущественные детали. В JavaScript абстракция достигается через создание классов и методов, которые скрывают сложные детали реализации.


// Пример абстракции
class Shape {
    constructor(name) {
        this.name = name;
    }

    getArea() {
        throw new Error("Метод getArea должен быть реализован.");
    }
}

class Circle extends Shape {
    constructor(radius) {
        super("Круг");
        this.radius = radius;
    }

    getArea() {
        return Math.PI * Math.pow(this.radius, 2);
    }
}

let circle = new Circle(5);
console.log(`${circle.name} с площадью: ${circle.getArea()}`);
// Круг с площадью: 78.53981633974483