JavaScript · Синтаксис · Початковий рівень
ООП: успадкування та перевизначення методів
Завдання по ООП JavaScript на спадкування, super(), constructor, перевизначення методів, toString(), власні методи класів і роботу з об'єктами.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
toString() і власні методи
#Патерни успадкування і методів
#Вправи:
Animal і Dog через наслідування.
#Створіть клас Animal, у створюваних ним об’єктів має бути властивість name. Значення у властивість передається під час створення об’єкта через constructor. Тобто об’єкт описує тварину (будь-яку) і зберігає її кличку. Потім створіть клас Dog, який успадковується від Animal. У класі Dog додайте метод toString, який повертає рядок, у якому міститься тип тварини (ахахах, вибачаюсь, "тип тварини" звучить смішно) і її кличка: "Dog: Rex" # приклад рядка, що повертається Сенс такий: базовий клас Animal зберігає основну "поведінку" об’єктів тварин, а клас Dog деталізує під конкретний тип тварини.
class Animal {
// ваш код тут
}
class Dog extends Animal {
// ваш код тут
}
Рішення
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
toString() {
return `Dog: ${this.name}`;
}
}
Book із рядковим представленням.
#Створіть клас Book із властивостями об’єктів title і pages. Додайте метод toString(), який повертає: "Book: JavaScript Basics (120 pages)" Можна також додати метод length(), який повертатиме кількість сторінок книги.
class Book {
// ваш код тут
}
Рішення
class Book {
constructor(title, pages) {
this.title = title;
this.pages = pages;
}
length() {
return this.pages;
}
toString() {
return `Book: ${this.title} (${this.pages} pages)`;
}
}
User і Admin.
#Давайте ще раз зробимо щось схоже на 1-ше: Умова: Створіть клас User із властивістю name. Створіть клас Admin, який успадковується від User. Перевизначте метод toString, щоб вивід був: "Admin: Alex" А у звичайного User через toString виводилось просто: "Alex"
class User {
// ваш код тут
}
class Admin extends User {
// ваш код тут
}
Рішення
class User {
constructor(name) {
this.name = name;
}
toString() {
return this.name;
}
}
class Admin extends User {
toString() {
return `Admin: ${this.name}`;
}
}
Коробка з предметами.
#Створіть клас Box із властивістю items_count. Додайте метод length(), який повертає кількість предметів. І додайте методи add і remove, які можуть класти й забирати об’єкт із коробки. Це можна зробити просто через лічильник items_count (просто рахувати без складнощів), або зробити масив предметів у коробці (рядків) і адаптувати клас для роботи з масивом (масив як властивість об’єкта).
class Box {
// ваш код тут
}
Рішення
class Box {
constructor(itemsCount) {
this.itemsCount = itemsCount;
}
add(count) {
if (count > 0) {
this.itemsCount += count;
}
}
remove(count) {
if (count > 0) {
this.itemsCount -= count;
if (this.itemsCount < 0) {
this.itemsCount = 0;
}
}
}
getCount() {
return this.itemsCount;
}
}
Message зі spam-прапорцем.
#Створіть клас Message із властивостями text і spam. Значення text передається під час створення об’єкта через constructor, а spam спочатку дорівнює null. Додайте методи: isSpam() — перевіряє, чи є в тексті слова, схожі на spam, повертає true/false і записує результат у this.spam; length() — повертає довжину тексту.
class Message {
// ваш код тут
}
Рішення
class Message {
constructor(text) {
this.text = text;
this.spam = null;
this.spamTriggers = ["куплю", "дорого"];
}
isSpam() {
if (this.spam !== null) {
return this.spam;
}
for (let trigger of this.spamTriggers) {
if (this.text.toLowerCase().includes(trigger)) {
this.spam = true;
return true;
}
}
this.spam = false;
return false;
}
length() {
return this.text.length;
}
}
let m = new Message("Куплю старі телевізори дорого!!!");
console.log(m.isSpam());
console.log(m.length());
Employee і Manager.
#Створіть клас Employee (працівник) із властивостями name і salary. Зробіть метод у Employee, який може змінювати зарплату. Створіть клас Manager, який успадковується від Employee. Перевизначте метод toString так, щоб вивід був: Manager John earns 5000 Переконайтеся, що метод зміни зарплати також працює для Manager
class Employee {
// ваш код тут
}
class Manager extends Employee {
// ваш код тут
}
Рішення
class Employee {
constructor(name, salary) {
this.name = name;
this.salary = salary;
}
changeSalary(coef) {
this.salary = Math.round(this.salary * coef);
}
}
class Manager extends Employee {
toString() {
return `Manager ${this.name} earns ${this.salary}`;
}
}
let manager = new Manager("Bob", 1000);
manager.changeSalary(1.1);
console.log(manager.toString());
Playlist і CustomPlaylist.
#Створіть клас Playlist із властивістю songs (масив). Додайте методи add і remove для додавання та видалення пісень. Додайте метод reverse(), який перевертає масив треків. Додайте метод length(), який повертає кількість пісень. Додайте метод isEmpty(), який перевіряє, порожній плейлист чи ні. Потім створіть клас-нащадок CustomPlaylist, у якому метод add() дозволятиме додавати дублікати пісень у плейлист. У базовому Playlist дублікати додавати не можна.
class Playlist {
// ваш код тут
}
Рішення
class Playlist {
constructor(songs) {
this.songs = songs;
}
add(song) {
if (!this.songs.includes(song)) {
this.songs.push(song);
}
}
remove(song) {
if (this.songs.includes(song)) {
this.songs.splice(this.songs.indexOf(song), 1);
}
}
reverse() {
this.songs.reverse();
}
length() {
return this.songs.length;
}
isEmpty() {
return this.songs.length === 0;
}
}
class CustomPlaylist extends Playlist {
add(song) {
this.songs.push(song);
}
}
Іменований CustomPlaylist.
#Допрацюйте попередній клас CustomPlaylist, додавши йому власний constructor. Він має викликати constructor батьківського класу через super(songs), а потім зберегти ім’я плейлиста у властивість name.
class CustomPlaylist extends Playlist {
constructor(songs, name) {
super(songs);
// ваш код тут
}
add(song) {
this.songs.push(song);
}
}
Рішення
class Playlist {
constructor(songs) {
this.songs = songs;
}
add(song) {
if (!this.songs.includes(song)) {
this.songs.push(song);
}
}
}
class CustomPlaylist extends Playlist {
constructor(songs, name) {
super(songs);
this.name = name;
}
add(song) {
this.songs.push(song);
}
toString() {
return `Playlist: ${this.name}`;
}
}
MagicBox із випадковим предметом.
#Давайте повернемося до класу Box (код нижче є). Давайте успадкуємося від нього й зробимо клас MagicBox. Єдина додана поведінка — це те, що під час створення об’єкта коробки в ній з’являтиметься випадковий предмет із масиву. Масив можливих випадкових предметів визначте де завгодно, це не важливо, хоч у глобальній області. Заготовка:
class Box {
constructor() {
this.items = [];
this.itemsCount = this.items.length;
}
add(item) {
this.items.push(item);
this.itemsCount = this.items.length;
}
remove(item) {
if (this.items.includes ? this.items.includes(item) : (item in this.items)) {
this.items.splice(this.items.indexOf(item), 1);
this.itemsCount = this.items.length;
} else {
console.log("Кіт із коробки каже: Такого тут немає, до побачення!");
}
}
length() {
return this.itemsCount;
}
}
let things = ["Шапка", "Парасолька", "Кружка"];
class MagicBox extends Box {
constructor() {
// викличте super() і додайте випадковий предмет
}
}
Рішення
function choice(items) {
return items[Math.floor(Math.random() * items.length)];
}
class Box {
constructor() {
this.items = [];
this.itemsCount = this.items.length;
}
add(item) {
this.items.push(item);
this.itemsCount = this.items.length;
}
remove(item) {
if (this.items.includes(item)) {
this.items.splice(this.items.indexOf(item), 1);
this.itemsCount = this.items.length;
} else {
console.log("Кіт із коробки каже: Такого тут немає, до побачення!");
}
}
length() {
return this.itemsCount;
}
}
const things = ["Шапка", "Парасолька", "Кружка"];
class MagicBox extends Box {
constructor() {
super();
this.items.push(choice(things));
this.itemsCount = this.items.length;
}
}