Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Object methods, 'this'
  • Loading branch information
MykolaSopiha committed Jul 24, 2021
commit 78bc1c0644417057c4266baf8ab9a359f4635664
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ alert( user.ref.name ); // Error: Cannot read property 'name' of undefined

Значення `this` є одним для всієї функції, блоки коду та літерали об’єктів на це не впливають.

Отже `ref: this` насправді бере значення `this` функції.
Отже, `ref: this` дійсно бере значення `this` функції.

Ми можемо переписати функцію і повернути те саме `this` зі значенням` undefined`:

```js run
function makeUser(){
return this; // цього разу немає літералу об’єкта
return this; // цього разу немає літерала об’єкта
}

alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ importance: 5

# Створіть калькулятор

Створіть об'єкт `calculator` трьома методами:
Створіть об'єкт `calculator` з трьома методами:

- `read()` запитує два значення та зберігає їх як властивості об'єкта.
- `sum()` повертає суму збережених значень.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ ladder.down();
ladder.showStep(); // 1
```

Змініть код `up`, `down` і `showStep`, щоб зробити доступними ланцюг викликів, наприклад:
Змініть код `up`, `down` і `showStep` так, щоб зробити доступними ланцюг викликів, наприклад:

```js
ladder.up().up().down().showStep(); // 1
Expand Down
14 changes: 7 additions & 7 deletions 1-js/04-object-basics/04-object-methods/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ user.sayHi(); // Привіт!
Коли ми пишемо наш код, використовуючи об’єкти для представлення сутностей, це називається [об’єктно-орієнтоване програмування
](https://uk.wikipedia.org/wiki/Об'єктно-орієнтоване_програмування), скорочено: "ООП".

ООП - велика річ, сама по собі цікава наука. Як правильно вибрати сутності? Як організувати взаємодію між ними? Це архітектура, і на цю тему є чудові книги, такі як "Шаблони проектування: елементи багаторазового об’єктно-орієнтованого програмного забезпечення" Е. Гамми, Р. Хелма, Р. Джонсона, Дж. Віссідеса або "Об’єктно-орієнтований аналіз та дизайн з Додатки "Г. Буча та ін.
ООП є великою предметною областю і цікавою наукою саме по собі. Як правильно обрати сутності? Як організувати взаємодію між ними? Це архітектура, і на цю тему є чудові книги, такі як "Шаблони проектування: елементи багаторазового об’єктно-орієнтованого програмного забезпечення" Е. Гамми, Р. Хелма, Р. Джонсона, Дж. Віссідеса або "Об’єктно-орієнтований аналіз та дизайн з застосунками" Г. Буча та ін.
```
### Скорочений запис методу

Expand All @@ -91,7 +91,7 @@ user = {

Як було показано, ми можемо опустити `"function"` і написати просто `sayHi()`.

Слід відзначити, що ці позначення не є повністю ідентичними. Існують тонкі відмінності, пов’язані з успадкуванням об’єктів (про які піде мова пізніше), але наразі вони не мають значення. Майже у всіх випадках скорочений синтаксис краще.
Слід відзначити, що ці позначення не є повністю ідентичними. Існують тонкі відмінності, пов’язані з наслідуванням об’єктів (про які піде мова пізніше), але наразі вони не мають значення. Майже у всіх випадках скорочений синтаксис краще.

## "this" в методах

Expand All @@ -101,7 +101,7 @@ user = {

**Для доступу до інформації всередині об’єкта метод може використовувати ключове слово `this`.**

Значенням `this` є об’єкт «перед крапкою», який використовується для виклику методу.
Значенням `this` є об’єкт "перед крапкою", який використовується для виклику методу.

Наприклад:

Expand All @@ -122,7 +122,7 @@ let user = {
user.sayHi(); // Іван
```

Тут під час виконання коду `user.sayHi()`, значенням `this` буде `user` (посилання на об’єкт).
Тут під час виконання коду `user.sayHi()`, значенням `this` буде `user`.

Також можна отримати доступ до об’єкта без цього, посилаючись на нього через зовнішню змінну:

Expand Down Expand Up @@ -231,7 +231,7 @@ sayHi(); // undefined

В JavaScript `this` є "вільним", його значення обчислюється під час виклику і не залежить від того, де метод був оголошений, а від того, який об’єкт "перед крапкою".

Поняття `this`, що оцінюється в процесі роботи має як плюси, так і мінуси. З одного боку, функцію можна використовувати повторно для різних об’єктів. З іншого боку, більша гнучкість створює більше можливостей для помилок.
Поняття `this`, що визначається в процесі роботи має як плюси, так і мінуси. З одного боку, функцію можна використовувати повторно для різних об’єктів. З іншого боку, більша гнучкість створює більше можливостей для помилок.

Тут наша позиція полягає не в тому, щоб судити, добре чи погане таке рішення щодо дизайну мови. Ми зрозуміємо, як з цим працювати, як отримати переваги та уникнути проблем.
```
Expand All @@ -254,7 +254,7 @@ let user = {
user.sayHi(); // Ілля
```

Це особливість стрілочних функцій, це корисно, коли ми насправді не хочемо мати окреме `this`, а скоріше взяти це із зовнішнього контексту. Далі в главі <info:arrow-functions> ми детальніше розглянемо стрілочні функції.
Це особливість стрілочних функцій є корисною коли ми не хочемо мати окреме `this`, а лише взяти його із зовнішнього контексту. Далі в главі <info:arrow-functions> ми детальніше розглянемо стрілочні функції.


## Висновок
Expand All @@ -266,6 +266,6 @@ user.sayHi(); // Ілля
- Значення `this` визначається під час виконання.
- Коли функція оголошена, вона може використовувати `this`, але саме `this` не має значення, доки функція не буде викликана.
- Функцію можна копіювати між об'єктами.
- Коли функція викликається в синтаксисі "метода": `object.method()`, значення `this` під час виклику є `object` – об’кт перед крапкою.
- Коли функція викликається в синтаксисі "методу": `object.method()`, значення `this` під час виклику є `object` – об’кт перед крапкою.

Зверніть увагу, що стрілочні функції є особливими: у них немає `this`. Коли всередині стрілочної функції звертаються до `this`, то його значення береться ззовні.