Урок 13: Введение в ООП
Объектно-ориентированное программирование (ООП) является важной парадигмой программирования, которая позволяет организовывать код в виде объектов, которые представляют собой сущности с состоянием и поведением. В этом уроке мы рассмотрим основы ООП и научимся создавать классы и объекты в JavaScript.
Основы объектно-ориентированного программирования
ООП основывается на нескольких ключевых концепциях:
- Классы и объекты: Класс — это шаблон для создания объектов. Объекты — это экземпляры класса.
- Инкапсуляция: Сокрытие внутреннего состояния объекта и предоставление доступа к нему только через методы.
- Наследование: Возможность создавать новые классы на основе существующих, наследуя их свойства и методы.
- Полиморфизм: Способность объектов разных классов реагировать на одинаковые сообщения (методы).
Создание классов и объектов
В JavaScript классы создаются с помощью ключевого слова class
. Конструктор класса определяется с использованием метода constructor
, который вызывается при создании нового объекта.
// Определение класса
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
// Создание объекта
let person1 = new Person('Alice', 30);
person1.greet(); // Hello, my name is Alice and I am 30 years old.
Hello, my name is Alice and I am 30 years old.
В этом примере мы создали класс Person
с конструктором, который принимает имя и возраст, и методом greet
, который выводит приветствие. Затем мы создали объект person1
на основе этого класса и вызвали метод greet
.
Наследование
Наследование позволяет создавать новый класс на основе существующего класса. В JavaScript для этого используется ключевое слово extends
.
// Определение класса Animal
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
// Определение класса Dog, наследующего класс Animal
class Dog extends Animal {
constructor(name, breed) {
super(name); // Вызов конструктора родительского класса
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
let dog = new Dog('Buddy', 'Golden Retriever');
dog.speak(); // Buddy barks.
В этом примере мы создали класс Animal
с методом speak
и класс Dog
, который наследует класс Animal
. Метод speak
был переопределен в классе Dog
.
Инкапсуляция
Инкапсуляция позволяет скрывать внутренние детали объекта и предоставлять доступ к ним только через методы. В JavaScript для этого используются приватные поля, которые начинаются с символа #
.
// Определение класса с приватным полем
class Counter {
#count = 0;
increment() {
this.#count++;
console.log(this.#count);
}
getCount() {
return this.#count;
}
}
let counter = new Counter();
counter.increment(); // 1
counter.increment(); // 2
console.log(counter.getCount()); // 2
В этом примере мы создали класс Counter
с приватным полем #count
. Это поле может быть изменено только внутри класса через методы increment
и getCount
.
Примеры использования ООП
Рассмотрим несколько примеров использования ООП в различных ситуациях.
// Пример 1: Класс автомобиля
class Car {
constructor(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
displayInfo() {
console.log(`Car: ${this.make} ${this.model} (${this.year})`);
}
}
let car = new Car('Toyota', 'Corolla', 2021);
car.displayInfo(); // Car: Toyota Corolla (2021)
// Пример 2: Класс пользователя
class User {
constructor(username, password) {
this.username = username;
this.password = password;
}
login(inputPassword) {
if (inputPassword === this.password) {
console.log('Login successful!');
} else {
console.log('Incorrect password.');
}
}
}
let user = new User('user1', 'securepassword');
user.login('wrongpassword'); // Incorrect password.
user.login('securepassword'); // Login successful!
Car: Toyota Corolla (2021)
Incorrect password.
Login successful!
Упражнения
Упражнение 1: Создание класса Book
Создайте класс Book
, который имеет свойства title
, author
и year
. Добавьте метод getSummary
, который возвращает строку с краткой информацией о книге. Создайте объект этого класса и вызовите метод getSummary
.
Решение:
// Определение класса Book
class Book {
constructor(title, author, year) {
this.title = title;
this.author = author;
this.year = year;
}
getSummary() {
return `${this.title} was written by ${this.author} in ${this.year}.`;
}
}
let book = new Book('1984', 'George Orwell', 1949);
console.log(book.getSummary()); // 1984 was written by George Orwell in 1949.
1984 was written by George Orwell in 1949.
Объяснение: Мы создали класс Book
с конструктором, который принимает название, автора и год издания книги, а также метод getSummary
, который возвращает строку с краткой информацией о книге. Затем мы создали объект book
на основе этого класса и вызвали метод getSummary
.
Упражнение 2: Создание класса Rectangle
Создайте класс Rectangle
, который имеет свойства width
и height
. Добавьте метод getArea
, который возвращает площадь прямоугольника, и метод getPerimeter
, который возвращает периметр прямоугольника. Создайте объект этого класса и вызовите оба метода.
Решение:
// Определение класса Rectangle
class Rectangle {
constructor(width, height) {
this.width = width;
this.height = height;
}
getArea() {
return this.width * this.height;
}
getPerimeter() {
return 2 * (this.width + this.height);
}
}
let rectangle = new Rectangle(5, 10);
console.log(rectangle.getArea()); // 50
console.log(rectangle.getPerimeter()); // 30
Объяснение: Мы создали класс Rectangle
с конструктором, который принимает ширину и высоту прямоугольника, а также метод getArea
для вычисления площади и метод getPerimeter
для вычисления периметра. Затем мы создали объект rectangle
на основе этого класса и вызвали оба метода.