You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: 1-js/08-prototypes/02-function-prototype/1-changing-prototype/solution.md
+4-4
Original file line number
Diff line number
Diff line change
@@ -3,17 +3,17 @@
3
3
4
4
1.`true`.
5
5
6
-
Визначення`Rabbit.prototype` встановлює властивість `[[Prototype]]` для новоствореного об’єкта, але це жодним чином не впливає на вже існуючий об’єкт.
6
+
Перепризначення`Rabbit.prototype` встановлює властивість `[[Prototype]]` для об'єктів, які будуть створені після цього. Але воно жодним чином не впливає на вже існуючі об'єкти.
7
7
8
8
2.`false`.
9
9
10
-
Об’єкти призначаються шляхом посилання на них. Об’єкт з властивістю`Rabbit.prototype` не дублюється, це є той самий об’єкт на який посилаються як через `Rabbit.prototype` так і через властивість `[[Prototype]]` об’єкта `rabbit`.
10
+
Об’єкти призначаються шляхом посилання на них. Об’єкт з властивості`Rabbit.prototype` не дублювався. Це той самий об’єкт на який посилаються як через `Rabbit.prototype`, так і через властивість `[[Prototype]]` об’єкта `rabbit`.
11
11
12
-
А отже, коли ми змінюємо контент такого об’єкта через посилання, такі зміни стають видимі і через інші посилання.
12
+
А отже, коли ми змінюємо вміст такого об’єкта через посилання, такі зміни стають видимі і через інші посилання.
13
13
14
14
3.`true`.
15
15
16
-
Усі `delete` операції застосовуються безпосередньо на самому об'єкті. Тут `delete rabbit.eats` намагається видалити властивість `eats` з об’єкта `rabbit`, але такої властивості немає. А тому така операція не має ніякого ефекту.
16
+
Усі `delete` операції застосовуються лише безпосередньо до самого об'єкта. Тут `delete rabbit.eats` намагається видалити властивість `eats` з об’єкта `rabbit`, але такої властивості немає. А тому така операція не має ніякого ефекту.
Так, ми можемо використовувати такий підхід якщо ми впевнені, що властивість `"constructor"` має правильне значення.
2
2
3
-
Для прикладу, якщо ми не чіпаємо властивість за замовчуванням `"prototype"`, тоді цей код буде працювати правильно:
3
+
Наприклад, якщо ми не чіпаємо властивість за замовчуванням `"prototype"`, тоді цей код буде працювати правильно:
4
4
5
5
```js run
6
6
functionUser(name) {
7
7
this.name= name;
8
8
}
9
9
10
-
let user =newUser('John');
11
-
let user2 =newuser.constructor('Pete');
10
+
let user =newUser('Богдан');
11
+
let user2 =newuser.constructor('Данило');
12
12
13
-
alert( user2.name ); //Pete (працює!)
13
+
alert( user2.name ); //Данило (працює!)
14
14
```
15
15
16
16
Код працює, тому що `User.prototype.constructor == User`.
@@ -27,23 +27,23 @@ function User(name) {
27
27
User.prototype= {}; // (*)
28
28
*/!*
29
29
30
-
let user =newUser('John');
31
-
let user2 =newuser.constructor('Pete');
30
+
let user =newUser('Богдан');
31
+
let user2 =newuser.constructor('Данило');
32
32
33
33
alert( user2.name ); // undefined
34
34
```
35
35
36
36
Чому `user2.name` є `undefined`?
37
37
38
-
Ось тут пояснення як `new user.constructor('Pete')` працює:
38
+
Ось тут пояснення як `new user.constructor('Данило')` працює:
39
39
40
40
1. Спочатку, здійснюється пошук у властивості `constructor` об’єкта `user`. Нічого не знаходять.
41
-
2. Потім переключаються на ланцюжок прототипу. Прототипом для об’єкта `user` є `User.prototype`, і він також не має властивості `constructor` (тому що ми "забули" визначити його правильним чином!).
41
+
2. Потім переключаються на ланцюжок прототипу. Прототипом для об’єкта `user` є `User.prototype`, і він також не має властивості `constructor` (тому що ми "забули" призначити його правильним чином!).
42
42
3. Йдучи далі по ланцюжку прототипу, визначаємо, що `User.prototype` є простий об’єкт, його прототипом є вбудований глобальний `Object.prototype`.
43
43
4. Врешті, для вбудованого `Object.prototype`, є вбудований конструктор глобального об’єкта `Object.prototype.constructor == Object` от він і використовується.
44
44
45
-
Таким чином, в кінці, ми отримуємо `let user2 = new Object('Pete')`.
45
+
Таким чином, в кінці кінців, ми отримуємо те ж саме, якби написали `let user2 = new Object('Данило')`.
46
46
47
47
Ймовірно, це не те, що нам потрібно. Ми би хотіли стоврити `new User`, а не `new Object`. Це і є наслідки пропуску властивості `constructor`.
48
48
49
-
(на випадок, якщо вас зацікавить, виклик `new Object(...)` перетворює його аргументи на об’єкт. Це в теорії, але на практиці ніхто не викликає `new Object` з аргументами; і загалом, не використовується узагалі `new Object` для створення нових об’єктів).
49
+
(на випадок, якщо вас зацікавить, виклик `new Object(...)` перетворює його аргументи на об’єкт. Це в теорії, але на практиці ніхто не викликає `new Object` з аргументами; і загалом, `new Object` майже не використовують для створення нових об’єктів).
Copy file name to clipboardexpand all lines: 1-js/08-prototypes/02-function-prototype/4-new-object-same-constructor/task.md
+1-1
Original file line number
Diff line number
Diff line change
@@ -12,4 +12,4 @@ importance: 5
12
12
let obj2 =newobj.constructor();
13
13
```
14
14
15
-
Покажіть приклад функції-конструктора для обєкта `obj`, який забезпечить правильну роботу такого коду, а також приклад, який, при такому коді, працює неправельно.
15
+
Покажіть приклад функції-конструктора для обєкта `obj`, який забезпечить правильну роботу такого коду, а також приклад, який, при такому коді, працює неправильно.
0 commit comments