Назад
Вперед
Зміст
Об'єктно-орієнтоване програмування в JavaScript
Класи
У об'єктно-орієнтованому програмуванні клас – це шаблон коду, що розширюється, для створення об'єктів, який встановлює в них початкові значення (властивості) і реалізацію поведінки (методи).
Базовий синтаксис виглядає так:
class MyClass {
// методы класса
constructor() { ... }
method1() { ... }
method2() { ... }
method3() { ... }
...
}
Часта помилка розробників-початківців – ставити кому між методами класу, що призводить до синтаксичної помилки.
У JavaScript клас – це різновид функції.
Ось що насправді робить конструкція class User {...}:
class User {
constructor(name) { this.name = name; }
sayHi() { alert(this.name); }
}
// Доказ: User - це функція
alert(typeof User); // Function
- Створює функцію з ім'ям User, яка стає результатом оголошення класу. Код функції береться з методу конструктора (вона буде порожньою, якщо такого методу немає).
Зберігає всі методи, такі як sayHi, в User.prototype.
При викликі методу об'єкта new User його буде взято з прототипу. Таким чином, об'єкти new User мають доступ до методів класу.
По-перше, функція, створена за допомогою class, позначена спеціальною внутрішньою властивістю [[FunctionKind]]:"classConstructor". Тому це не зовсім те саме, що створювати її вручну.
На відміну від звичайних функцій конструктор класу не може бути викликаний без new.
Bо-друге,методи класу є непереліченими. Визначення класу встановлює прапор numerable в false для всіх методів "prototype".
І це добре, тому що якщо ми проходимося циклом for..in по об'єкту, то зазвичай ми не хочемо при цьому отримувати методи класу.
По-третє, класи завжди використовують use strict. Весь код всередині класу автоматично знаходиться в строгому режимі. Як і функції, класи можна визначати всередині іншого виразу, передавати, повертати, надавати і т.д.
Приклад 2
Розмітка сторінки містить блок, в якому відображатиметься робота скрипту та малюнок об'єкта, який ми будемо створювати. По клацанню на картинці має бути видана інформація про об'єкт.

Створюємо клас Animal.

Створюємо клас Hen(курка). Але ми хочемо, щоб Hen розширював Animal. Інакше кажучи, курки мають походити від тварин, тобто. мати доступ до методів Animal та розширювати функціональність Animal своїми методами.
Для того, щоб успадкувати клас від іншого, ми повинні використовувати ключове слово extends і вказати назву батьківського класу перед {..}.

Ключове слово extends працює за допомогою прототипів. Він встановлює Hen.prototype.[[Prototype]] в Animal.prototype. Отже, якщо метод не знайдено в Hen.prototype, JavaScript бере його з Animal.prototype.


Відпрацювання програми.


Перевизначення методів
Давайте перевизначимо метод. Зараз Hen успадковує від Animal метод stop, який встановлює this.speed = 0.Якщо ми визначимо свій метод stop у класі Hen, то він використовуватиметься замість батьківського:


Як і в літеральних об'єктах, у класах можна оголошувати обчислювані властивості, гетери/сетери і т.д.
Ось приклад animal.name, реалізованого з використанням get/set:

Прості завдання на класи
- Створити клас Car та Driver (водій). Клас Driver містить поля - ПІБ, стаж водіння.
Клас Engine (мотор) містить поля – потужність, виробник.
Клас Car містить поля – марка автомобіля, клас автомобіля, вага, водій типу Driver, мотор типу Engine. Методи start(), stop(), turnRight(), turnLeft(), які виводять на друк: "Поїхали", "Зупиняємося", "Поворот праворуч" або "Поворот ліворуч". А також метод printInfo(), який виводить повну інформацію про автомобіль, її водія і двигуна.
Створити похідний від Car клас - Lorry (вантажівка), що характеризується також вантажопідйомністю кузова. Створити похідний від Car клас - SportCar, який також характеризується граничною швидкістю.
- Створити клас Person, який містить:
- поля fullName, age.
- методи move() і talk(), в яких просто вивести на консоль повідомлення -"Такийсь Person говорить".
- Додайте конструктор Person(fullName, age).
- Створіть два об'єкти цього класу.
- Клас Phone.
- Створіть клас Phone, який містить змінні number, model та weight.
- Створіть три екземпляри цього класу.
- Виведіть на сторінку значення змінних.
- Додати в клас Phone методи: receiveCall, який приймає два параметри - ім'я телефону і номер телефону телефону. Викликати цей метод. Виводить на консоль повідомлення "Телефонує {name}". getNumber – повертає номер телефону. Викликати ці методи кожного з об'єктів.
- Додати конструктор до класу Phone, який приймає на вхід три параметри для ініціалізації змінних класу - number, model та weight.
-
Створити клас Animal та розширюючі його класи Dog, Cat, Horse. Клас Animal містить змінні food, location і методи makeNoise, eat, sleep. Метод makeNoise, наприклад, може виводити на консоль "Така тварина спить". Dog, Cat, Horse перевизначають методи makeNoise, eat. Додайте змінні до класів Dog, Cat, Horse, що характеризують лише цих тварин. Створіть клас Ветеринар, у якому визначте метод void treatAnimal(Animal animal). Нехай цей метод роздруковує food і location тварини, що прийшла на прийом. У методі main створіть масив типу Animal, в який запишіть тварин всіх типів, що є у вас. У циклі надсилайте їх на прийом до ветеринара.
- Реалізуйте клас MyString, який буде мати такі методи: метод reverse(), який параметром приймає рядок, а повертає його в перевернутому вигляді, метод ucFirst(), який параметром приймає рядок, а повертає цей же рядок, зробивши його першу літеру заголовком і метод ucWords, який приймає рядок і робить заголовною першу літеру кожного слова цього рядка.
- Реалізуйте клас Worker (Працівник), який матиме такі властивості: name (ім'я), surname (прізвище), rate (ставка за день роботи), days (кількість відпрацьованих днів). Також клас повинен мати метод getSalary(), який виводитиме зарплату працівника. Зарплата - це добуток (множення) ставки rate на кількість відпрацьованих днів days.
За допомогою нашого класу створіть двох робітників і знайдіть суму їхніх зарплат.
-
Реалізуйте клас Tram (трамвай), який успадковуватиметься від класу Transport, подібно до того, як це зроблено в теоретичній частині уроку. Цей клас повинен мати такі властивості: номер (номер, успадковується від Transport), typetram (швидкісний чи ні, успадковується від Transport), year (рік створення). Клас повинен мати метод getFullInfo() (успадковується від Transport), за допомогою якого можна вивести одночасно всю інформацію про транспортний засіб. Також клас повинен мати метод getAge(), який виводитиме поточний вік трамвая(обчислюється так: потрібно від поточного року відібрати рік створення). Поточний рік отримаєте самостійно.
-
Реалізуйте клас Student (Студент), який успадковуватиметься від класу User, подібно до того, як це зроблено в теоретичній частині уроку. Цей клас повинен мати такі властивості: name (ім'я, успадковується від User), surname (прізвище, успадковується від User), year (рік вступу до вузу). Клас повинен мати метод getFullName() (успадковується від User), за допомогою якого можна вивести одночасно ім'я та прізвище студента. Також клас повинен мати метод getCourse(), який виводитиме поточний курс студента (від 1 до 5). Курс обчислюється так: потрібно від поточного року відібрати рік вступу до вузу. Поточний рік отримаєте самостійно.
- Реалізуйте клас Student та клас Aspirant(спадкоємець Student), аспірант відрізняється від студента наявністю якоїсь наукової роботи.
Клас Student містить змінні: String firstName, - lastName,
- group.
- А також double averageMark, що містить середню оцінку.
Створити метод getScholarship() для класу Student, який повертає суму стипендії. Якщо середня оцінка студента дорівнює 5, то сума 100 грн., інакше 80. Перевизначити цей метод у класі Aspirant. Якщо середня оцінка аспіранта дорівнює 5, то сума 200 грн., інакше 180 грн.
- Визначити клас Reader(читач), який зберігає таку інформацію про користувача бібліотеки: ПІБ, номер квитка читача, факультет, дата народження, телефон. Методи takeBook(), returnBook().
- takeBook, який прийматиме кількість взятих книг. Виводить на консоль повідомлення "Петров В. В. взяв 3 книги".
- метод returnBook(). Виводить на консоль повідомлення "Петров В. В. повернув книги: Пригоди, Словник, Енциклопедія". Або "Петров В. В. повернув 3 книги".
- Створити клас Point, який описує точку на площині за двома її координатами і містить:
- Поле координати x;
- Поле координати y;
- Конструктор з двома параметрами, що надає значення цим полям.
- Метод Print – виведення координат точки на екран.
- Метод Leng –знаходження відстані від цієї точки до початку координат.
Створити дочірній клас ColorPoint, що описує кольорову точку на площині та містить:
- Поле типу ConsoleColor, яке містить колір точки.
- Конструктор. У конструкторі класу використовувати три параметри – координати точки та колір.
- Перевизначаємо метод Print - виведення координат точки на екран. Повідомлення виводиться кольором, що передається.
- Батьківський клас - папуга:
- Поле вік;
- Поле розмір (у балах від 1 до 5);
- Метод Q=вік*розмір
Дочірній клас папуги:
- Додаткове логічне поле p – вміння говорити;
- Метод: якщо вміє говорити, то Qp=Q*10, якщо не вміє, то Qp=Q
Створити об'єкт дочірнього класу.
За допомогою успадкованого методу Q обчислити якість об'єкта.
За допомогою власного методу Qp обчислити "Уточнену якість" об'єкта.
- Створити клас - комп'ютерна мережа:
- Поле число робочих станцій (2-10);
- Поле відстань між станціями в м (5-100);
- Метод Q=число станцій* відстань
Дочірній клас корпоративної мережі:
- Додаткове поле p - швидкість передачі Мб/с (20-120);
- Метод: Qp=Q*р
Створити об'єкт дочірнього класу.
За допомогою успадкованого методу Q обчислити якість об'єкта.
За допомогою власного методу Qp обчислити "Уточнену якість" об'єкта.
- Створити клас - телевізор:
- Поле діагональ екрану (см);
- Поле звукова потужність (дБ);
- Метод Q=діагональ+0,05*Потужність
- Дочірній клас-смарт телевізор:
- Додаткове поле p - країна виробник
- Метод: якщо країна Японія, то Qp=2*Q, в інших випадках Qp=1,5*Q.
- Створити клас "Вектор". Клас повинен мати такі поля:
- одновимірний масив дійсних чисел;
- кількість елементів у масиві.
-
Клас повинен мати такі методи:
- додавання з іншим вектором;
множення на число;
- виведення на друк;
- скалярний добуток векторів - за бажанням.
- Створити клас "Матриця". Клас повинен мати такі поля:
- двовимірний масив дійсних чисел;
- кількість рядків і стовпців у матриці.
- Клас повинен мати такі методи:
- додавання з іншою матрицею;
множення на число;
- виведення на друк;
- множення матриць - за бажанням.
Назад
Вперед
Зміст