Skip to content

Commit ba25b96

Browse files
authored
Merge pull request iliakan#349 from ruslanpetrov/patch-2
Добавление: Добавлено объяснение к решению
2 parents 8be56e4 + 49aea91 commit ba25b96

File tree

1 file changed

+12
-1
lines changed
  • 1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor

1 file changed

+12
-1
lines changed

1-js/9-prototypes/2-new-prototype/4-new-object-same-constructor/solution.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,22 @@ function User(name) {
2222
this.name = name;
2323
}
2424
*!*
25-
User.prototype = {};
25+
User.prototype = {}; // (*)
2626
*/!*
2727

2828
var obj = new User('Вася');
2929
var obj2 = new obj.constructor('Петя');
3030

3131
alert( obj2.name ); // undefined
3232
```
33+
34+
Почему obj2.name равен undefined? Вот как это работает:
35+
36+
1. При вызове new obj.constructor('Петя'), obj ищет у себя свойство constructor - не находит.
37+
2. Обращается к своему скрытому свойству __proto__, которое ведёт к прототипу.
38+
3. Прототипом будет (*).
39+
4. Далее здесь также ищется свойство constructor - его нет.
40+
5. Где ищем дальше? Правильно - у следующего прототипа выше, а им будет Object.prototype.
41+
6. У Object.prototype есть constructor, поэтому происходит вызов такого плана: Object.prototype.constructor('Петя') или конкретнее: obj2.__proto__.__proto__.constructor('Петя').
42+
7. Этот метод возвратит объект-обёртку. В зависимости от переданного аргумента будет определяться тип объекта-обёртки, в нашем случае была передана строка 'Петя', значит будет возвращено: String {0: "П", 1: "е", 2: "т", 3: "я", length: 4, [[PrimitiveValue]]: "Петя"} (в Chrome), как будто мы вызвали new String('Петя'). Если бы мы передали число 5, то возвратилось: Number {[[PrimitiveValue]]: 5} и так далее.
43+
8. Поэтому obj2.name равен undefined, так как, у String {0: "П", 1: "е", 2: "т", 3: "я", length: 4, [[PrimitiveValue]]: "Петя"} нету свойства name.

0 commit comments

Comments
 (0)