Почему я не могу напрямую получить доступ к объекту литерала объекта?
Почему следующий синтаксис
{a:1,b:2}.constructor
недействителен, тогда как
[1,2].constructor
действительно?
Ответы
Ответ 1
{a:1,b:2}.constructor
не является недопустимым синтаксисом, но он неоднозначен, потому что {}
обозначает блок или объект? Таким образом, вы должны устранить двусмысленность выражения с помощью круглых скобок, например ({a:1,b:2}).constructor
. Теперь JavaScript знает, что вы хотите использовать объект.
Если вы используете этот синтаксис в контексте, где он явно является объектом, то нет никакой двусмысленности:
console.log({a:1,b:2}.constructor) // works fine
Ответ 2
Скобковые скобки в начале строки распознаются как блок кода вместо литерала объекта.
Если вы посмотрите на ошибку в консоли, вы можете увидеть Uncaught SyntaxError: Unexpected token :
. Таким образом, ошибка заключается не в вызове свойства конструктора.
Кроме того, когда вы пишете в консоли
{a:1}
JS интерпретирует это как блок с label, а не объект с свойством a
.