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
Почему obj2.name равен undefined? Вот как это работает:
35
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.
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