Здесь происходит удивительное количество, поэтому я постараюсь разбить его на шаги.
0
- это примитивное число. Примитивы не имеют свойств, и любая попытка получить свойство (например, (0).constructor
) приведет к автоматическому преобразованию Javascript в представление объекта. Например, (0)
становится Number(0)
. (0)
все еще является примитивом, только с добавлением операторов группировки ()
. Это делается здесь, потому что без скобок .
в 0.
интерпретируется как десятичная точка, а не как средство доступа к свойству. Вы можете достичь того же с помощью 0..constructor
или рядом других способов. - Все Javascript объекты имеют
prototype
. Вы можете увидеть прототип объекта, используя его свойство __proto__
, например (0).__proto__
. prototype
интересен тем, что, когда вы пытаетесь получить доступ к свойству объекта, Javascript также проверит объект __proto__
, чтобы узнать, существует ли это свойство на нем. (Это используется в основном для наследования). - Одно из свойств
__proto__
- constructor
. constructor
- это функция, которая вызывается при первом создании объекта. constructor
имеет тип Function
, который сам является объектом со своим собственным свойством constructor
.
Итак, (0).constructor.constructor
является сокращением для Number(0).__proto__.constructor.__proto__.constructor
.
Ваши анонимные функции, которые возвращают 9
, делают то, что они делают, потому что конструктор Function
принимает в качестве аргумента строковое представление некоторого кода Javascript. Это эквивалентно следующему:
Function('return 9')()
;
Редактировать: исправлена ошибка, связанная с автобоксом, и (0)