Как создается эта функция? A = (0) ['конструктор'] ['конструктор'] - PullRequest
2 голосов
/ 06 февраля 2020

Для онлайн-вызова я деобфускировал некоторый код к этому:

A = (0)['constructor']['constructor']

Из того, что я пробовал, эта функция берет некоторый код в качестве параметра и помещает его в тело анонимной функции. и возвращает его.

A = (0)['constructor']['constructor']

console.log(A)
console.log(A('return 9'))
console.log(A('return 9')())

Однако я не понимаю этот синтаксис и как создается функция. Что происходит за сценой?

1 Ответ

3 голосов
/ 06 февраля 2020

Здесь происходит удивительное количество, поэтому я постараюсь разбить его на шаги.

  • 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)

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