SlideShare a Scribd company logo
1 of 20
Download to read offline
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 Олег Вілігурський

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

exam ЄВІ example of this exam for students for masters degree 2024
exam ЄВІ example of this exam for students for masters degree 2024exam ЄВІ example of this exam for students for masters degree 2024
exam ЄВІ example of this exam for students for masters degree 2024
OASISENGLISHOFFICIAL
 

Recently uploaded (9)

Габон
ГабонГабон
Габон
 
Україна в умовах десталінізації (1953 – 1964 рр.).pptx
Україна в умовах десталінізації (1953 – 1964 рр.).pptxУкраїна в умовах десталінізації (1953 – 1964 рр.).pptx
Україна в умовах десталінізації (1953 – 1964 рр.).pptx
 
Пасивний будинок Енергоефективність ОБСБД.pptx
Пасивний будинок Енергоефективність ОБСБД.pptxПасивний будинок Енергоефективність ОБСБД.pptx
Пасивний будинок Енергоефективність ОБСБД.pptx
 
80 років від часу депортації з Криму кримських татар і осіб інших національно...
80 років від часу депортації з Криму кримських татар і осіб інших національно...80 років від часу депортації з Криму кримських татар і осіб інших національно...
80 років від часу депортації з Криму кримських татар і осіб інших національно...
 
Балади про Робіна Гуда. Аналіз образу Робіна Гуда
Балади про Робіна Гуда. Аналіз образу Робіна ГудаБалади про Робіна Гуда. Аналіз образу Робіна Гуда
Балади про Робіна Гуда. Аналіз образу Робіна Гуда
 
Роль українців у перемозі в Другій світовій війні
Роль українців у перемозі в Другій світовій війніРоль українців у перемозі в Другій світовій війні
Роль українців у перемозі в Другій світовій війні
 
Спектроскоп. Спостереження оптичних явищ
Спектроскоп. Спостереження оптичних явищСпектроскоп. Спостереження оптичних явищ
Спектроскоп. Спостереження оптичних явищ
 
Хвороби картоплі та заходи боротьби з ними
Хвороби картоплі та заходи боротьби з нимиХвороби картоплі та заходи боротьби з ними
Хвороби картоплі та заходи боротьби з ними
 
exam ЄВІ example of this exam for students for masters degree 2024
exam ЄВІ example of this exam for students for masters degree 2024exam ЄВІ example of this exam for students for masters degree 2024
exam ЄВІ example of this exam for students for masters degree 2024
 

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. Створіть чотирилапого зайця і дволапого індика.