Skip to content

Commit b05d99e

Browse files
committed
fixed mistakes and simplified explanation
**In chapter 01-08-02 prototype-inheritance** There were many mistakes. And some of sentences were correct, but they were "unnatural" in Ukrainian and make understanding more difficult.
1 parent a62746d commit b05d99e

File tree

4 files changed

+27
-27
lines changed

4 files changed

+27
-27
lines changed

1-js/08-prototypes/02-function-prototype/article.md

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
Як відомо, ми можемо створювати нові об’єкти за допомогою функції-конструктора, ось так `new F()`.
44

5-
Якщо розглядати `F.prototype` як властивість об’єкта, то оператор `new` автоматично створює приховану властивість `[[Prototype]]` для новоствореного об’єкта.
5+
Якщо в `F.prototype` міститься об'єкт, то оператор `new` автоматично встановлює той об'єкт в `[[Prototype]]` для новоствореного об’єкта.
66

77
```smart
8-
JavaScript мала можливість успадкування властивостей через прототипи ще від самого початку її створення. Це було одним з головних особливостей мови.
8+
JavaScript використовувала прототипне наслідування з моменту своєї появи. Це одна з особливостей цієї мови.
99
10-
Але в ті часи, не було прямого доступу до прототипів. Тільки одна річ, яка працювала надійно, була властивість функції-конструктора `"prototype"` , яка і описана в цій главі. Ось чому ще існує багато коду де цю властивість використовують.
10+
Але раніше, в давні часи, прямого доступу до прототипа в об'єкта не було. Надійно працювала лише властивість "prototype" функції-конструктора, описане в цьому розділі. Тому ця властивість використовується в багатьох скриптах.
1111
```
1212

13-
Зауважте, що `F.prototype` тут означає звичайну властивість, яку назвали `"prototype"` в об’єкті `F`. Це звучить дуже співзвучно з терміном "prototype", але тут це означає всього лиш звичайне ім’я властивості.
13+
Зауважте, що `F.prototype` тут є звичайною властивістю, яку назвали `"prototype"` в об’єкті `F`. Це звучить дуже співзвучно з терміном "prototype", але тут це означає всього лиш звичайне ім’я властивості.
1414

1515
Ось приклад:
1616

@@ -27,37 +27,37 @@ function Rabbit(name) {
2727
Rabbit.prototype = animal;
2828
*/!*
2929

30-
let rabbit = new Rabbit("White Rabbit"); // rabbit.__proto__ == animal
30+
let rabbit = new Rabbit("Білий кролик"); // rabbit.__proto__ == animal
3131

3232
alert( rabbit.eats ); // true
3333
```
3434

35-
Вираз `Rabbit.prototype = animal` дослівно означає наступне: "коли `new Rabbit` створено, його властивість `[[Prototype]]` посилається на обєкт `animal`".
35+
Вираз `Rabbit.prototype = animal` дослівно означає наступне: "коли буде створено `new Rabbit`, його властивість `[[Prototype]]` має посилатись на об'єкт `animal`".
3636

3737
Ось кінцева картинка:
3838

3939
![](proto-constructor-animal-rabbit.svg)
4040

41-
На картинці, `"prototype"` що показана горизонтальною стрілкою, це звичайна властивість, а `[[Prototype]]`показана вертикальною, що означає `rabbit` успадковує властивості від свого прототипа `animal`.
41+
На картинці, `"prototype"` що зображена біля горизонтальної стрілки - це звичайна властивість, а `[[Prototype]]`, що зображена біля вертикальної стрілки - вказує на те, що `rabbit` успадковує властивості від свого прототипа `animal`.
4242

43-
```smart header="`F.prototype` використовується тільки у разі використання функції-конструктора `new F`"
44-
Властивість `F.prototype` використовується коли буде викликано `new F`, і створює властивість `[[Prototype]]` для нового обєкта.
43+
```smart header="`F.prototype` використовується тільки у в момент виклику функції-конструктора `new F`"
44+
`F.prototype` використовується тільки при виклику `new F` і присвоюється в якості властивості `[[Prototype]]` нового об'єкта.
4545

46-
Якщо властивість `F.prototype` після створення змінюється (`F.prototype = <another object>`), тоді і новий об’єкт який створюється функцією-конструктором `new F` буде мати посилання `[[Prototype]]` на інший обєкт, а в раніше створених об’єктах є свої прототипи які були визначені ще при їх створенні.
46+
Якщо після створення властивість `F.prototype` зміниться (`F.prototype = <інший об'єкт>`), то нові об'єкти, створені з допомогою `new F`, будуть мати в якості `[[Prototype]]` інший об'єкт, а вже існуючі об'єкти будуть посилатись на старий.
4747
```
4848
4949
## Типове значення F.prototype, властивості конструктора
5050
51-
Кожна функція має властивість `"prototype"` навіть якщо ми цю властивість самі не прописуємо. Тобто вона існує за замовчуванням, або ця властивість є типовою.
51+
Кожна функція за замовчуванням має властивість `"prototype"`, навіть якщо ми цю властивість самі не прописуємо.
5252
53-
В свою чергу, така типова властивість `"prototype"` представляє собою об’єкт, який має єдину властивість з назвою `constructor`, що зворотньо посилається на назву самої функції-конструктора.
53+
За замовчуванням "prototype" є об'єктом з однією єдиною властивістю `constructor`, яка посилається на саму ж функцію.
5454
5555
Ось як тут:
5656
5757
```js
5858
function Rabbit() {}
5959
60-
/* властивість створена за замовчуванням
60+
/* значення prototype, яке призначається за замовченням
6161
Rabbit.prototype = { constructor: Rabbit };
6262
*/
6363
```
@@ -74,7 +74,7 @@ function Rabbit() {}
7474
alert( Rabbit.prototype.constructor == Rabbit ); // true
7575
```
7676

77-
Отже, якщо ми нічого не робимо з властивістю `constructor` то вона є доступна для всіх об’єктів rabbits через `[[Prototype]]`:
77+
Ну й логічно, якщо ми самі нічого з властивістю `constructor` не робимо, то вона є доступна для всіх об’єктів `rabbit` через `[[Prototype]]`:
7878

7979
```js run
8080
function Rabbit() {}
@@ -88,7 +88,7 @@ alert(rabbit.constructor == Rabbit); // true (від прототипу)
8888

8989
![](rabbit-prototype-constructor.svg)
9090

91-
Ми можемо використовувати властивість `constructor` для створення нових об’єктів використовуючи той самий конструктор, який вже існує.
91+
Ми можемо використовувати властивість `constructor` для створення нових об’єктів використовуючи ту саму функцію-конструктор, як і для вже існуючих.
9292

9393
Як тут:
9494

@@ -98,22 +98,22 @@ function Rabbit(name) {
9898
alert(name);
9999
}
100100

101-
let rabbit = new Rabbit("White Rabbit");
101+
let rabbit = new Rabbit("Білий кролик");
102102

103103
*!*
104-
let rabbit2 = new rabbit.constructor("Black Rabbit");
104+
let rabbit2 = new rabbit.constructor("Чорний кролик");
105105
*/!*
106106
```
107107

108-
Це дуже практично у випадку наявності об’єкта, але не знаємо за допомогою якого саме конструктора той об’єкт був створений (для прикладу який був імпортований з якоїсь бібліотеки), а нам потрібно створити новий об’єкт по типу того, що вже існує.
108+
Це дуже практично у випадку якщо ми маємо об'єкт, не знаємо за допомогою якого саме конструктора той об’єкт був створений (до прикладу якщо він був імпортований з якоїсь бібліотеки), а нам потрібно створити новий об’єкт по типу того, що вже існує.
109109

110-
Але самим важливим моментом щодо `"constructor"` є те, що...
110+
Але найважливішим моментом щодо `"constructor"` є те, що...
111111

112112
**...Сама мова JavaScript не забезпечує правильного значення `"constructor"`.**
113113

114-
Так, воно існує за замовчуванням у властивостях `"prototype"` для функцій, але це все, що є. Те, що стається з `"constructor"` пізніше, цілковито залежить від нас самих.
114+
Так, `constructor` існує за замовчуванням у властивостях `"prototype"` для функцій, але це й усе. Подальша доля `"constructor"` повністю в наших руках.
115115

116-
А саме, якщо ми замінимо типове значення на якесь інше, тоді в ньому не буде ніякого `"constructor"`.
116+
А саме, якщо ми замінимо дефолтне значення `prototype` на якесь інше, тоді в `prototype` не буде ніякого `"constructor"`.
117117

118118
Наприклад:
119119

@@ -129,7 +129,7 @@ alert(rabbit.constructor === Rabbit); // false
129129
*/!*
130130
```
131131

132-
Отже, щоб мати правильний `"constructor"` ми можемо чи додавати, чи видаляти властивості у дефолтному `"prototype"` замість того, щоб її цілковито заміняти:
132+
Отже, щоб мати правильний `"constructor"`, замість цілком заміняти дефолтний `prototype` якимось нашим іншим об'єктом, ми можемо просто додавати або видаляти властивості до уже наявного дефолтного `"prototype"`:
133133

134134
```js
135135
function Rabbit() {}
@@ -140,7 +140,7 @@ Rabbit.prototype.jumps = true
140140
// а тому дефолтне Rabbit.prototype.constructor зберігається
141141
```
142142

143-
чи по іншому, відновлюємо `constructor` вручну:
143+
чи ось інший варіант, відновлюємо `constructor` вручну:
144144

145145
```js
146146
Rabbit.prototype = {
@@ -161,7 +161,7 @@ Rabbit.prototype = {
161161
Все досить просто, тільки треба додати кілька деталей щоб усе було зрозуміло:
162162

163163
- Властивість об’єкта `F.prototype` (ні в якому разі не `[[Prototype]]`) встановлює приховану властивість `[[Prototype]]` нового об’єкта, тільки тоді, коли буде викликана через `new F()`.
164-
- Значення властивості `F.prototype` може бути, або посиланням на об’єкт, або `null`: інші значення не працюють.
164+
- Значення властивості `F.prototype` може бути або посиланням на об’єкт, або `null`: значення інших типів не спрацюють.
165165
- Тільки властивість `"prototype"` має такий спеціальний ефект: може встановлюватись в конструкторі та може викликатись через оператор `new`.
166166

167167
У звичайних об’єктах властивість `prototype` не є чимось спеціальним:
Lines changed: 1 addition & 1 deletion
Loading

0 commit comments

Comments
 (0)