Когда вы пишете A.constructor()
, вы на самом деле не вызываете конструктор класса A, который вы определили в классе A, вы получаете доступ к Object.prototype.constructor из A. What Object.prototype.конструктор делает?Он возвращает ссылку на конструктор, который использовался для создания A.
Поскольку A является классом, а класс является функцией в javascript, A.constructor
возвращает ссылку на Function
, т. Е. A.constructor
эквивалентноFunction
.
Поскольку Function("alert('hi')")
в javascript эквивалентно ƒ anonymous( ) { alert('hi') }
, A.construtor("alert('hi')")
эквивалентно ƒ anonymous( ) { alert('hi') }
.
Таким образом, это означает, что A.construtor("alert('hi')")
возвращает ссылку на функцию, т.е. ƒ anonymous( ) { alert('hi') }
, что отвечает на 1-ю часть вашего вопроса.
Теперь, как вы вызываете функцию вJavaScript?Вы используете круглые скобки после ссылки на функцию.Поскольку A.constructor("alert('hi')")
возвращает ссылку на функцию, вы можете вызвать эту функцию, используя A.constructor("alert('hi')")()
, который выполняет предупреждение.Это отвечает на 2-ю часть вашего вопроса.
В третьей части, то есть A.constructor()('alert("Hi")')
, во-первых, A.constructor()
возвращает ƒ anonymous( ) {}
, который вы называете, поставляя скобки впереди, еслито есть ('alert("Hi")'
но поскольку эта функция пуста, при ее вызове ничего не происходит.Так что это отвечает на 3-ю часть вашего вопроса.
Надеюсь, это прояснит путаницу.