SlideShare a Scribd company logo
OOP
Object Oriented Programming
Об’єктно-орієнтоване програмування – такий
підхід у програмуванні, в якому програма
розглядається як множина об’єктів, які взаємодіють
між собою. При цьому кожен з об’єктів є
екземпляром певного класу. Класи можуть
утворювати ієрархію успадкування.
Прикладами об’єктів можуть бути:
• меню;
• ігровий персонаж;
• галерея;
• елемент сторінки…
Об’єкти. Методи. this
У об’єктах може міститись інформація, яка подається у
вигляді набору пар ім‘я/значення, але об’єкти ще
можуть мати функції-методи.
Приклад:
var person = {
name: "Колобок",
age: 0.1,
talk: function () { alert("Я від діда
втік, я від баби втік..."); }
};
Виклик методу:
person.talk();
Методи можна додавати і видаляти.
Наприклад:
var animal = {
name: 'Заєць'
};
animal.talk = function() { // метод
призначається після створення об'єкта
alert('Колобок, колобок, я тебе з'їм!');
};
animal.talk(); // виклик методу
Для того, щоб метод мав доступ до свого
власного об’єкта, використовується ключове
слово this.
animal.sayHi = function() {
alert('Привіт, мене звати ' + this.name);
};
animal.sayHi();
this можна використати для оголошення
функції без об’єкта.
function sayHi() {
alert('Привіт, мене звати ' + this.name );
}
animal.hi = sayHi;
person.hi = sayHi;
animal.hi();
person.hi();
Можна застосувати інший підхід, де
використовується конструктор класу:
function Animal(name) { // конструктор класу Animal
this.sayHi = function() {
alert( "Привіт, мене звати " + name );
};
}
var zayets = new Animal("Заєць"); // створюємо нову
"тварину" (новий екземпляр класу)
zayets.sayHi(); // у нього вже є метод sayHi()
var vovk = new Animal("Вовк"); // створюємо ще одну
"тварину"
vovk.sayHi(); // який теж має метод sayHi()
Внутрішній і зовнішній інтерфейси об’єктів
• Внутрішній інтерфейс – це властивості і методи, доступ
до яких можливий тільки з інших методів цього об’єкта.
Це «приватні» властивості і методи.
• Зовнішній інтерфейс – це властивості і методи, доступні
зовні об’єкта. Це «публічні» властивості і методи.
Приклад:
function Animal(name) {
var legsNumber = 4; // кількість ніг
this.isHungry = true; // тварина голодна alert(
'Створено тварину. Тварину звати ' + name);
}
// створюємо тварину з іменем "Індик"
var animal = new Animal("Індик");
// змінити кількість ніг
animal.legsNumber = 2;
alert(animal); // неінформативно
alert(JSON.stringify(animal)); // значно наочніше
Приватними властивостями є локальні змінні і параметри
конструктора. У попредньому прикладі приватними
властивостями є name і legsNumber.
Властивості, записані в this, можна вважати публічними. В
прикладі – isHungry.
Додамо публічний метод sayToKolobok і приватний
swallow:
function Animal(name) {
var legsNumber = 4; // кількість ніг
this.isHungry = true; // тварина голодна
this.sayToKolobok = function() {
alert( "Колобок, колобок, я тебе з'їм!" );
}
function swallow() {
alert( 'Наївся!' );
}
}
var animal = new Animal("Індик");
animal.sayToKolobok();
animal.swallow(); // TypeError: animal.swallow
is not a function
Задача 86
1. Створіть клас Kolobok з параметром конструктора
health.
2. Створіть у класі публічний метод sing. Колобок
повинен співати "Я від діда втік, я від баби втік".
3. Створіть приватний метод increaseHealth, який буде
збільшувати “здоров’я” Колобка (health) на 1 пункт за 1
секунду, але не більше як до 100.
4. Створюйте колобка натисканням кнопки “Спекти колобка”.
При цьому він повинен “народитись” з health=50 і зразу
заспівати.
Розв’язок
<button onclick="makeKolobok()">Спекти колобка</button>
<div id=kolobokDiv></div>
<script>
function Kolobok(health) {
var timerId;
this.sing = function() { alert( "Я від діда втік, я від баби втік" ); }
timerId = setInterval(increaseHealth, 100);
function increaseHealth() {
if (health < 100) {
health++;
kolobokDiv.innerHTML = health;
} else {
alert( "Здоровий!" );
clearInterval(timerId);
}
}
};
function makeKolobok() {
var kolobok = new Kolobok(50);
kolobok.sing();
}
</script>
Ґеттери і сеттери
Додамо колобку публічну властивість
speed.
this.speed = 0;
Це потенційно небезпечно, бо будь-хто
може “копнути” колобка так, що його
швидкість перевищить швидкість світла.
Тому краще зробити цю властивість
приватною, а її зміну виконувати через
спеціальний метод, який називають
сеттером (setter).
function Kolobok(health, maxSpeed) {
var timerId;
var speed = 0;
this.setSpeed = function(s) {
if (s < 0) {
alert ("швидкість повинна бути додатною");
}
if (s > maxSpeed) {
alert ("не можна запустити колобка зі
швидкістю понад " + maxSpeed);
}
speed = s;
}
...
}
...
var kolobok = new Kolobok(50, 100);
kolobok.setSpeed(-60); // буде повідомлення
Але тепер speed – приватна властивість і ми її не
можемо прочитати.
alert( kolobok.speed ); // undefined
Щоб зовнішній код зміг прочитати значення швидкості,
створимо спеціальну функцію – ґеттер (getter).
function Kolobok(health, maxSpeed) {
this.setSpeed = function(s) {
...
speed = s;
}
this.getSpeed = function() {
return speed;
};
...
}
var kolobok = new Kolobok(50, 100);
kolobok.setSpeed(60);
alert( kolobok.getSpeed() ); // 60
Для зручності можна об’єднати ґеттер і сеттер в один метод,
який зазвичай називають так само, як відповідна властивість.
Якщо цей метод викликати з параметом, функція передає
параметр властивості, якщо без параметра – читає властивість.
function Kolobok(health, maxSpeed) {
var speed = 0;
this.speed = function(s) {
if (!arguments.length) return speed; // ґеттер
if (s < 0) { // сеттер
alert ("швидкість повинна бути додатною");
}
if (s > maxSpeed) {
alert ("не можна перевищити " + maxSpeed);
}
speed = s;
}
...
}
var kolobok = new Kolobok(50, 100);
kolobok.speed(70);
alert( kolobok.speed() );
Задача 87
1. Додайте Вашому колобку описаний вище ґеттер-сеттер
для швидкості. Протестуйте з різними значеннями швидкості
після створення колобка.
2. Додайте ґеттер для “здоров’я” колобка.
Розв’язок
function Kolobok(health, maxSpeed) {
var timerId;
var speed = 0;
this.speed = function(s) {
if (!arguments.length) return speed; // ґеттер
if (s < 0) { // сеттер
alert ("швидкість повинна бути додатною");
}
if (s > maxSpeed) {
alert ("не можна запустити колобка зі швидкістю понад " + maxSpeed);
}
speed = s;
}
this.getHealth = function() {
return health;
};
...
};
function makeKolobok() {
var kolobok = new Kolobok(50, 100);
kolobok.speed(70);
alert( kolobok.speed() );
alert( kolobok.getHealth() );
}
Задача 88
1. Напишіть конструктор Animal з
приватними властивостями name і
legsNumber (кількість ніг).
2. Створіть сеттери для цих властивостей.
3. Створіть ґеттер, який повертає зразу ім’я
і кількість ніг.
4. Створіть чотирилапого зайця і дволапого
індика.

More Related Content

More from Олег Вілігурський

Theme20_ajax
Theme20_ajaxTheme20_ajax
Theme19_css
Theme19_cssTheme19_css
Theme18_css
Theme18_cssTheme18_css
Theme17a css
Theme17a cssTheme17a css
Theme17
Theme17Theme17
Theme16
Theme16Theme16
Coding for Future in Lutsk. JavaScript. Part 15
Coding for Future in Lutsk. JavaScript. Part 15Coding for Future in Lutsk. JavaScript. Part 15
Coding for Future in Lutsk. JavaScript. Part 15
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 14
Coding for Future in Lutsk. JavaScript. Part 14Coding for Future in Lutsk. JavaScript. Part 14
Coding for Future in Lutsk. JavaScript. Part 14
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 13
 Coding for Future in Lutsk. JavaScript. Part 13 Coding for Future in Lutsk. JavaScript. Part 13
Coding for Future in Lutsk. JavaScript. Part 13
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 12
Coding for Future in Lutsk. JavaScript. Part 12Coding for Future in Lutsk. JavaScript. Part 12
Coding for Future in Lutsk. JavaScript. Part 12
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 11
Coding for Future in Lutsk. JavaScript. Part 11Coding for Future in Lutsk. JavaScript. Part 11
Coding for Future in Lutsk. JavaScript. Part 11
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 10
Coding for Future in Lutsk. JavaScript. Part 10Coding for Future in Lutsk. JavaScript. Part 10
Coding for Future in Lutsk. JavaScript. Part 10
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 9
Coding for Future in Lutsk. JavaScript. Part 9Coding for Future in Lutsk. JavaScript. Part 9
Coding for Future in Lutsk. JavaScript. Part 9
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 8
Coding for Future in Lutsk. JavaScript. Part 8Coding for Future in Lutsk. JavaScript. Part 8
Coding for Future in Lutsk. JavaScript. Part 8
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 7
Coding for Future in Lutsk. JavaScript. Part 7Coding for Future in Lutsk. JavaScript. Part 7
Coding for Future in Lutsk. JavaScript. Part 7
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 4
Coding for Future in Lutsk. JavaScript. Part 4Coding for Future in Lutsk. JavaScript. Part 4
Coding for Future in Lutsk. JavaScript. Part 4
Олег Вілігурський
 
Coding for Future in Lutsk. JavaScript. Part 3
Coding for Future in Lutsk. JavaScript. Part 3Coding for Future in Lutsk. JavaScript. Part 3
Coding for Future in Lutsk. JavaScript. Part 3
Олег Вілігурський
 

More from Олег Вілігурський (20)

Theme21_json
Theme21_jsonTheme21_json
Theme21_json
 
Theme20_ajax
Theme20_ajaxTheme20_ajax
Theme20_ajax
 
Theme19_css
Theme19_cssTheme19_css
Theme19_css
 
Theme18_css
Theme18_cssTheme18_css
Theme18_css
 
Theme17a css
Theme17a cssTheme17a css
Theme17a css
 
Theme17
Theme17Theme17
Theme17
 
Theme16
Theme16Theme16
Theme16
 
Coding for Future in Lutsk. JavaScript. Part 15
Coding for Future in Lutsk. JavaScript. Part 15Coding for Future in Lutsk. JavaScript. Part 15
Coding for Future in Lutsk. JavaScript. Part 15
 
Coding for Future in Lutsk. JavaScript. Part 14
Coding for Future in Lutsk. JavaScript. Part 14Coding for Future in Lutsk. JavaScript. Part 14
Coding for Future in Lutsk. JavaScript. Part 14
 
Coding for Future in Lutsk. JavaScript. Part 13
 Coding for Future in Lutsk. JavaScript. Part 13 Coding for Future in Lutsk. JavaScript. Part 13
Coding for Future in Lutsk. JavaScript. Part 13
 
Coding for Future in Lutsk. JavaScript. Part 12
Coding for Future in Lutsk. JavaScript. Part 12Coding for Future in Lutsk. JavaScript. Part 12
Coding for Future in Lutsk. JavaScript. Part 12
 
Coding for Future in Lutsk. JavaScript. Part 11
Coding for Future in Lutsk. JavaScript. Part 11Coding for Future in Lutsk. JavaScript. Part 11
Coding for Future in Lutsk. JavaScript. Part 11
 
Coding for Future in Lutsk. JavaScript. Part 10
Coding for Future in Lutsk. JavaScript. Part 10Coding for Future in Lutsk. JavaScript. Part 10
Coding for Future in Lutsk. JavaScript. Part 10
 
Coding for Future in Lutsk. JavaScript. Part 9
Coding for Future in Lutsk. JavaScript. Part 9Coding for Future in Lutsk. JavaScript. Part 9
Coding for Future in Lutsk. JavaScript. Part 9
 
Coding for Future in Lutsk. JavaScript. Part 8
Coding for Future in Lutsk. JavaScript. Part 8Coding for Future in Lutsk. JavaScript. Part 8
Coding for Future in Lutsk. JavaScript. Part 8
 
Coding for Future in Lutsk. JavaScript. Part 7
Coding for Future in Lutsk. JavaScript. Part 7Coding for Future in Lutsk. JavaScript. Part 7
Coding for Future in Lutsk. JavaScript. Part 7
 
Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6
 
Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5
 
Coding for Future in Lutsk. JavaScript. Part 4
Coding for Future in Lutsk. JavaScript. Part 4Coding for Future in Lutsk. JavaScript. Part 4
Coding for Future in Lutsk. JavaScript. Part 4
 
Coding for Future in Lutsk. JavaScript. Part 3
Coding for Future in Lutsk. JavaScript. Part 3Coding for Future in Lutsk. JavaScript. Part 3
Coding for Future in Lutsk. JavaScript. Part 3
 

Recently uploaded

Віртуальна виставка «Допомога НАТО Україні»
Віртуальна виставка «Допомога НАТО Україні»Віртуальна виставка «Допомога НАТО Україні»
Віртуальна виставка «Допомога НАТО Україні»
Vinnytsia Regional Universal Scientific Library named after Valentin Otamanovsky
 
KUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdf
KUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdfKUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdf
KUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdf
Olga Kudriavtseva
 
Підсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdf
Підсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdfПідсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdf
Підсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdf
ssuser7541ef1
 
Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...
Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...
Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...
tetiana1958
 
Основи_історичної_просвіти_—_для_перекладу.pdf
Основи_історичної_просвіти_—_для_перекладу.pdfОснови_історичної_просвіти_—_для_перекладу.pdf
Основи_історичної_просвіти_—_для_перекладу.pdf
olaola5673
 
29.05.2024.docx29.05.2024.docx29.05.2024.docx
29.05.2024.docx29.05.2024.docx29.05.2024.docx29.05.2024.docx29.05.2024.docx29.05.2024.docx
29.05.2024.docx29.05.2024.docx29.05.2024.docx
Репетитор Історія України
 
LOBANOVA_Tetiana_PORTFOLIO_Librarian.pdf
LOBANOVA_Tetiana_PORTFOLIO_Librarian.pdfLOBANOVA_Tetiana_PORTFOLIO_Librarian.pdf
LOBANOVA_Tetiana_PORTFOLIO_Librarian.pdf
Olga Kudriavtseva
 
POPOVICH_Nina_PORTFOLIO_librarianCRE.pdf
POPOVICH_Nina_PORTFOLIO_librarianCRE.pdfPOPOVICH_Nina_PORTFOLIO_librarianCRE.pdf
POPOVICH_Nina_PORTFOLIO_librarianCRE.pdf
Olga Kudriavtseva
 
Главлит_2_0_Книжкова_цензура_в_Росії.pdf
Главлит_2_0_Книжкова_цензура_в_Росії.pdfГлавлит_2_0_Книжкова_цензура_в_Росії.pdf
Главлит_2_0_Книжкова_цензура_в_Росії.pdf
olaola5673
 
«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова
«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова
«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова
estet13
 

Recently uploaded (10)

Віртуальна виставка «Допомога НАТО Україні»
Віртуальна виставка «Допомога НАТО Україні»Віртуальна виставка «Допомога НАТО Україні»
Віртуальна виставка «Допомога НАТО Україні»
 
KUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdf
KUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdfKUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdf
KUDRIAVTSEVA_Olha_PORTFOLIO_librarian.pdf
 
Підсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdf
Підсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdfПідсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdf
Підсумки, перспективи роботи профспільнот педагогів ЗДО (2).pdf
 
Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...
Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...
Важливість впровадження стандарту ISO/IEC 17025:2019 у процес державних випро...
 
Основи_історичної_просвіти_—_для_перекладу.pdf
Основи_історичної_просвіти_—_для_перекладу.pdfОснови_історичної_просвіти_—_для_перекладу.pdf
Основи_історичної_просвіти_—_для_перекладу.pdf
 
29.05.2024.docx29.05.2024.docx29.05.2024.docx
29.05.2024.docx29.05.2024.docx29.05.2024.docx29.05.2024.docx29.05.2024.docx29.05.2024.docx
29.05.2024.docx29.05.2024.docx29.05.2024.docx
 
LOBANOVA_Tetiana_PORTFOLIO_Librarian.pdf
LOBANOVA_Tetiana_PORTFOLIO_Librarian.pdfLOBANOVA_Tetiana_PORTFOLIO_Librarian.pdf
LOBANOVA_Tetiana_PORTFOLIO_Librarian.pdf
 
POPOVICH_Nina_PORTFOLIO_librarianCRE.pdf
POPOVICH_Nina_PORTFOLIO_librarianCRE.pdfPOPOVICH_Nina_PORTFOLIO_librarianCRE.pdf
POPOVICH_Nina_PORTFOLIO_librarianCRE.pdf
 
Главлит_2_0_Книжкова_цензура_в_Росії.pdf
Главлит_2_0_Книжкова_цензура_в_Росії.pdfГлавлит_2_0_Книжкова_цензура_в_Росії.pdf
Главлит_2_0_Книжкова_цензура_в_Росії.pdf
 
«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова
«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова
«Слова і кулі». Письменники, що захищають Україну. Єлизавета Жарікова
 

Theme22-OOP

  • 2. Об’єктно-орієнтоване програмування – такий підхід у програмуванні, в якому програма розглядається як множина об’єктів, які взаємодіють між собою. При цьому кожен з об’єктів є екземпляром певного класу. Класи можуть утворювати ієрархію успадкування. Прикладами об’єктів можуть бути: • меню; • ігровий персонаж; • галерея; • елемент сторінки…
  • 3. Об’єкти. Методи. this У об’єктах може міститись інформація, яка подається у вигляді набору пар ім‘я/значення, але об’єкти ще можуть мати функції-методи. Приклад: var person = { name: "Колобок", age: 0.1, talk: function () { alert("Я від діда втік, я від баби втік..."); } }; Виклик методу: person.talk();
  • 4. Методи можна додавати і видаляти. Наприклад: var animal = { name: 'Заєць' }; animal.talk = function() { // метод призначається після створення об'єкта alert('Колобок, колобок, я тебе з'їм!'); }; animal.talk(); // виклик методу
  • 5. Для того, щоб метод мав доступ до свого власного об’єкта, використовується ключове слово this. animal.sayHi = function() { alert('Привіт, мене звати ' + this.name); }; animal.sayHi();
  • 6. this можна використати для оголошення функції без об’єкта. function sayHi() { alert('Привіт, мене звати ' + this.name ); } animal.hi = sayHi; person.hi = sayHi; animal.hi(); person.hi();
  • 7. Можна застосувати інший підхід, де використовується конструктор класу: function Animal(name) { // конструктор класу Animal this.sayHi = function() { alert( "Привіт, мене звати " + name ); }; } var zayets = new Animal("Заєць"); // створюємо нову "тварину" (новий екземпляр класу) zayets.sayHi(); // у нього вже є метод sayHi() var vovk = new Animal("Вовк"); // створюємо ще одну "тварину" vovk.sayHi(); // який теж має метод sayHi()
  • 8. Внутрішній і зовнішній інтерфейси об’єктів • Внутрішній інтерфейс – це властивості і методи, доступ до яких можливий тільки з інших методів цього об’єкта. Це «приватні» властивості і методи. • Зовнішній інтерфейс – це властивості і методи, доступні зовні об’єкта. Це «публічні» властивості і методи.
  • 9. Приклад: function Animal(name) { var legsNumber = 4; // кількість ніг this.isHungry = true; // тварина голодна alert( 'Створено тварину. Тварину звати ' + name); } // створюємо тварину з іменем "Індик" var animal = new Animal("Індик"); // змінити кількість ніг animal.legsNumber = 2; alert(animal); // неінформативно alert(JSON.stringify(animal)); // значно наочніше
  • 10. Приватними властивостями є локальні змінні і параметри конструктора. У попредньому прикладі приватними властивостями є name і legsNumber. Властивості, записані в this, можна вважати публічними. В прикладі – isHungry. Додамо публічний метод sayToKolobok і приватний swallow:
  • 11. function Animal(name) { var legsNumber = 4; // кількість ніг this.isHungry = true; // тварина голодна this.sayToKolobok = function() { alert( "Колобок, колобок, я тебе з'їм!" ); } function swallow() { alert( 'Наївся!' ); } } var animal = new Animal("Індик"); animal.sayToKolobok(); animal.swallow(); // TypeError: animal.swallow is not a function
  • 12. Задача 86 1. Створіть клас Kolobok з параметром конструктора health. 2. Створіть у класі публічний метод sing. Колобок повинен співати "Я від діда втік, я від баби втік". 3. Створіть приватний метод increaseHealth, який буде збільшувати “здоров’я” Колобка (health) на 1 пункт за 1 секунду, але не більше як до 100. 4. Створюйте колобка натисканням кнопки “Спекти колобка”. При цьому він повинен “народитись” з health=50 і зразу заспівати.
  • 13. Розв’язок <button onclick="makeKolobok()">Спекти колобка</button> <div id=kolobokDiv></div> <script> function Kolobok(health) { var timerId; this.sing = function() { alert( "Я від діда втік, я від баби втік" ); } timerId = setInterval(increaseHealth, 100); function increaseHealth() { if (health < 100) { health++; kolobokDiv.innerHTML = health; } else { alert( "Здоровий!" ); clearInterval(timerId); } } }; function makeKolobok() { var kolobok = new Kolobok(50); kolobok.sing(); } </script>
  • 14. Ґеттери і сеттери Додамо колобку публічну властивість speed. this.speed = 0; Це потенційно небезпечно, бо будь-хто може “копнути” колобка так, що його швидкість перевищить швидкість світла. Тому краще зробити цю властивість приватною, а її зміну виконувати через спеціальний метод, який називають сеттером (setter).
  • 15. function Kolobok(health, maxSpeed) { var timerId; var speed = 0; this.setSpeed = function(s) { if (s < 0) { alert ("швидкість повинна бути додатною"); } if (s > maxSpeed) { alert ("не можна запустити колобка зі швидкістю понад " + maxSpeed); } speed = s; } ... } ... var kolobok = new Kolobok(50, 100); kolobok.setSpeed(-60); // буде повідомлення
  • 16. Але тепер speed – приватна властивість і ми її не можемо прочитати. alert( kolobok.speed ); // undefined Щоб зовнішній код зміг прочитати значення швидкості, створимо спеціальну функцію – ґеттер (getter). function Kolobok(health, maxSpeed) { this.setSpeed = function(s) { ... speed = s; } this.getSpeed = function() { return speed; }; ... } var kolobok = new Kolobok(50, 100); kolobok.setSpeed(60); alert( kolobok.getSpeed() ); // 60
  • 17. Для зручності можна об’єднати ґеттер і сеттер в один метод, який зазвичай називають так само, як відповідна властивість. Якщо цей метод викликати з параметом, функція передає параметр властивості, якщо без параметра – читає властивість. function Kolobok(health, maxSpeed) { var speed = 0; this.speed = function(s) { if (!arguments.length) return speed; // ґеттер if (s < 0) { // сеттер alert ("швидкість повинна бути додатною"); } if (s > maxSpeed) { alert ("не можна перевищити " + maxSpeed); } speed = s; } ... } var kolobok = new Kolobok(50, 100); kolobok.speed(70); alert( kolobok.speed() );
  • 18. Задача 87 1. Додайте Вашому колобку описаний вище ґеттер-сеттер для швидкості. Протестуйте з різними значеннями швидкості після створення колобка. 2. Додайте ґеттер для “здоров’я” колобка.
  • 19. Розв’язок function Kolobok(health, maxSpeed) { var timerId; var speed = 0; this.speed = function(s) { if (!arguments.length) return speed; // ґеттер if (s < 0) { // сеттер alert ("швидкість повинна бути додатною"); } if (s > maxSpeed) { alert ("не можна запустити колобка зі швидкістю понад " + maxSpeed); } speed = s; } this.getHealth = function() { return health; }; ... }; function makeKolobok() { var kolobok = new Kolobok(50, 100); kolobok.speed(70); alert( kolobok.speed() ); alert( kolobok.getHealth() ); }
  • 20. Задача 88 1. Напишіть конструктор Animal з приватними властивостями name і legsNumber (кількість ніг). 2. Створіть сеттери для цих властивостей. 3. Створіть ґеттер, який повертає зразу ім’я і кількість ніг. 4. Створіть чотирилапого зайця і дволапого індика.