Skip to content

Commit a0a59bc

Browse files
authored
Update solution.md
1 parent ba25b96 commit a0a59bc

File tree

1 file changed

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

1 file changed

+6
-8
lines changed

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,9 @@ alert( obj2.name ); // undefined
3333

3434
Почему obj2.name равен undefined? Вот как это работает:
3535

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.
36+
1. При вызове new `obj.constructor('Петя')`, `obj` ищет у себя свойство `constructor` -- не находит.
37+
2. Обращается к своему свойству `__proto__`, которое ведёт к прототипу.
38+
3. Прототипом будет (*), пустой объект.
39+
4. Далее здесь также ищется свойство constructor -- его нет.
40+
5. Где ищем дальше? Правильно -- у следующего прототипа выше, а им будет `Object.prototype`.
41+
6. Свойство `Object.prototype.constructor` существует, это встроенный конструктор объектов, который, вообще говоря, не предназначен для вызова с аргументом-строкой, поэтому создаст совсем не то, что ожидается, но то же самое, что вызов `new Object('Петя')`, и у такого объекта не будет `name`.

0 commit comments

Comments
 (0)