Почему конструктор javascript печатает переданный ему аргумент? - PullRequest
0 голосов
/ 07 декабря 2018

Я хотел знать внутреннюю работу конструктора в javascript.
Так вот, с чем я сталкиваюсь - допустим, класс A

class A {
constructor(){}
}

Теперь, когда я запускаю команду вconsole

A.constructor('alert("Hi")')

Эта команда выводит

ƒ anonymous() {
 alert("Hi")
 }

Почему не отображается полная инициализация или я что-то упустил?

Это приводит к выполнению оповещения при запуске

A.constructor('alert("Hi")')()

Хотя при запуске этого

A.constructor()('alert("Hi")')

предупреждение не выполняется.

Я полностью сбит с толку и поэтому хочу знать, как конструктор интерпретирует вещи.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Когда вы пишете 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-ю часть вашего вопроса.

Надеюсь, это прояснит путаницу.

0 голосов
/ 07 декабря 2018

1.

A.constructor('alert("Hi")')

Поскольку A является классом (= функция), A.constructor является встроенным конструктором Function, и этот код такой же, как

Function('alert("Hi")')

или

function () { alert("Hi") }

, то есть анонимная функция с телом alert("Hi").Консоль отображает именно это.

2.

A.constructor('alert("Hi")')()

совпадает с

Function('alert("Hi")')()

или

( function() { alert("Hi") } ) ()

, то естьвновь созданная функция вызывается и отображает предупреждение.

3.

 A.constructor()('alert("Hi")')

A.constructor равно Function, а Function() создает анонимную функцию без тела, поэтому мыhave:

 ( function() {} ) ('alert("Hi")')

Функция вызывается с аргументом alert("Hi"), но, поскольку она не имеет тела, ничего не происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...