Skip to content

Commit 426a7d1

Browse files
authored
Merge pull request #718 from Andrii256/01-08-02-function-prototype
Fixed function prototype (01 08 02)
2 parents 0810fa4 + 403dec6 commit 426a7d1

File tree

8 files changed

+43
-43
lines changed

8 files changed

+43
-43
lines changed

1-js/08-prototypes/02-function-prototype/1-changing-prototype/solution.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33

44
1. `true`.
55

6-
Визначення `Rabbit.prototype` встановлює властивість `[[Prototype]]` для новоствореного об’єкта, але це жодним чином не впливає на вже існуючий об’єкт.
6+
Перепризначення `Rabbit.prototype` встановлює властивість `[[Prototype]]` для об'єктів, які будуть створені після цього. Але воно жодним чином не впливає на вже існуючі об'єкти.
77

88
2. `false`.
99

10-
Об’єкти призначаються шляхом посилання на них. Об’єкт з властивістю `Rabbit.prototype` не дублюється, це є той самий об’єкт на який посилаються як через `Rabbit.prototype` так і через властивість `[[Prototype]]` об’єкта `rabbit`.
10+
Об’єкти призначаються шляхом посилання на них. Об’єкт з властивості `Rabbit.prototype` не дублювався. Це той самий об’єкт на який посилаються як через `Rabbit.prototype`, так і через властивість `[[Prototype]]` об’єкта `rabbit`.
1111

12-
А отже, коли ми змінюємо контент такого об’єкта через посилання, такі зміни стають видимі і через інші посилання.
12+
А отже, коли ми змінюємо вміст такого об’єкта через посилання, такі зміни стають видимі і через інші посилання.
1313

1414
3. `true`.
1515

16-
Усі `delete` операції застосовуються безпосередньо на самому об'єкті. Тут `delete rabbit.eats` намагається видалити властивість `eats` з об’єкта `rabbit`, але такої властивості немає. А тому така операція не має ніякого ефекту.
16+
Усі `delete` операції застосовуються лише безпосередньо до самого об'єкта. Тут `delete rabbit.eats` намагається видалити властивість `eats` з об’єкта `rabbit`, але такої властивості немає. А тому така операція не має ніякого ефекту.
1717

1818
4. `undefined`.
1919

1-js/08-prototypes/02-function-prototype/1-changing-prototype/task.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 5
44

55
# Заміна властивості "prototype"
66

7-
В коді, що показаний нижче, ми створюємо об’єкт `new Rabbit` і потім міняємо його прототип.
7+
В коді, що показаний нижче, ми створюємо функцію-конструктор `new Rabbit` і потім змінюємо її `prototype`.
88

99
На початку, маємо цей код:
1010

Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
Так, ми можемо використовувати такий підхід якщо ми впевнені, що властивість `"constructor"` має правильне значення.
22

3-
Для прикладу, якщо ми не чіпаємо властивість за замовчуванням `"prototype"`, тоді цей код буде працювати правильно:
3+
Наприклад, якщо ми не чіпаємо властивість за замовчуванням `"prototype"`, тоді цей код буде працювати правильно:
44

55
```js run
66
function User(name) {
77
this.name = name;
88
}
99

10-
let user = new User('John');
11-
let user2 = new user.constructor('Pete');
10+
let user = new User('Богдан');
11+
let user2 = new user.constructor('Данило');
1212

13-
alert( user2.name ); // Pete (працює!)
13+
alert( user2.name ); // Данило (працює!)
1414
```
1515

1616
Код працює, тому що `User.prototype.constructor == User`.
@@ -27,23 +27,23 @@ function User(name) {
2727
User.prototype = {}; // (*)
2828
*/!*
2929

30-
let user = new User('John');
31-
let user2 = new user.constructor('Pete');
30+
let user = new User('Богдан');
31+
let user2 = new user.constructor('Данило');
3232

3333
alert( user2.name ); // undefined
3434
```
3535

3636
Чому `user2.name` є `undefined`?
3737

38-
Ось тут пояснення як `new user.constructor('Pete')` працює:
38+
Ось тут пояснення як `new user.constructor('Данило')` працює:
3939

4040
1. Спочатку, здійснюється пошук у властивості `constructor` об’єкта `user`. Нічого не знаходять.
41-
2. Потім переключаються на ланцюжок прототипу. Прототипом для об’єкта `user` є `User.prototype`, і він також не має властивості `constructor` (тому що ми "забули" визначити його правильним чином!).
41+
2. Потім переключаються на ланцюжок прототипу. Прототипом для об’єкта `user` є `User.prototype`, і він також не має властивості `constructor` (тому що ми "забули" призначити його правильним чином!).
4242
3. Йдучи далі по ланцюжку прототипу, визначаємо, що `User.prototype` є простий об’єкт, його прототипом є вбудований глобальний `Object.prototype`.
4343
4. Врешті, для вбудованого `Object.prototype`, є вбудований конструктор глобального об’єкта `Object.prototype.constructor == Object` от він і використовується.
4444

45-
Таким чином, в кінці, ми отримуємо `let user2 = new Object('Pete')`.
45+
Таким чином, в кінці кінців, ми отримуємо те ж саме, якби написали `let user2 = new Object('Данило')`.
4646

4747
Ймовірно, це не те, що нам потрібно. Ми би хотіли стоврити `new User`, а не `new Object`. Це і є наслідки пропуску властивості `constructor`.
4848

49-
(на випадок, якщо вас зацікавить, виклик `new Object(...)` перетворює його аргументи на об’єкт. Це в теорії, але на практиці ніхто не викликає `new Object` з аргументами; і загалом, не використовується узагалі `new Object` для створення нових об’єктів).
49+
(на випадок, якщо вас зацікавить, виклик `new Object(...)` перетворює його аргументи на об’єкт. Це в теорії, але на практиці ніхто не викликає `new Object` з аргументами; і загалом, `new Object` майже не використовують для створення нових об’єктів).

1-js/08-prototypes/02-function-prototype/4-new-object-same-constructor/task.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ importance: 5
1212
let obj2 = new obj.constructor();
1313
```
1414

15-
Покажіть приклад функції-конструктора для обєкта `obj`, який забезпечить правильну роботу такого коду, а також приклад, який, при такому коді, працює неправельно.
15+
Покажіть приклад функції-конструктора для обєкта `obj`, який забезпечить правильну роботу такого коду, а також приклад, який, при такому коді, працює неправильно.

0 commit comments

Comments
 (0)