ECMAScript | Экзотические объекты Связанных Функций

ECMAScript | Экзотические объекты Связанных Функций

Экзотический объект связанной функции (bound function exotic object) — это экзотический объект, который является оболочкой для другого функционального объекта. Экзотический объект связанной функции является вызываемым (callable) (он имеет внутренний метод [[Call]] и может иметь внутренний метод [[Construct]]). Вызов экзотического объекта связанной функции обычно приводит к вызову ее обёрнутой функции.

Объект является «экзотическим объектом связанной функции» (bound function exotic object), если его внутренние методы [[Call]] и (если применимо) [[Construct]] используют следующие реализации, а его другие важные внутренние методы используют определения, найденные в разделе 10.1. Эти методы устанавливаются в BoundFunctionCreate.

Экзотические объекты связанных функций не имеют внутренних слотов объектов функций ECMAScript, перечисленных в таблице 30. Вместо этого у них есть внутренние слоты, перечисленные в таблице 31, в дополнение к [[Prototype]] и [[Extensible]].

 

Internal Slot (Внутренний слот) Type (Тип) Description (Описание)
[[BoundTargetFunction]] Вызываемый объект Обёрнутый функциональный объект.
[[BoundThis]] Любой Значение, которое всегда передается как значение this при вызове функции-оболочки.
[[BoundArguments]] Список из любых Список значений, элементы которых используются в качестве первых аргументов любого вызова обернутой функции.

Таблица 31: Внутренние слоты связанных функций экзотических объектов

 

 

[[Call]] ( thisArgument, argumentsList )

Внутренний метод [[Call]] экзотического объекта связанной функции F принимает аргументы thisArgument (значение языка ECMAScript) и argumentsList (список значений языка ECMAScript). При вызове он выполняет следующие шаги:

1. Пусть целью target будет F.[[BoundTargetFunction]].
2. Пусть boundThis будет F.[[BoundThis]].
3. Пусть boundArgs будет F.[[BoundArguments]].
4. Пусть args будет Списком, элементы которого являются элементами boundArgs, за которыми следуют элементы argumentsList.
5. Вернуть ? Вызов(target, boundThis, args).

 

[[Construct]] ( argumentsList, newTarget )

Внутренний метод [[Construct]] экзотического объекта связанной функции F принимает аргументы argumentsList (Список значений языка ECMAScript) и newTarget (конструктор). При вызове он выполняет следующие шаги:

1. Пусть целью target будет F.[[BoundTargetFunction]].
2. Утверждено: IsConstructor(target) является true (истинно).
3. Пусть boundArgs будет F.[[BoundArguments]].
4. Пусть args будет Списком, элементы которого являются элементами boundArgs, за которыми следуют элементы argumentsList.
5. Если SameValue(F, newTarget) является true (истинно), установите для newTarget значение target.
6. Вернуть ? Построить(target, args, newTarget).

 

BoundFunctionCreate ( targetFunction, boundThis, boundArgs )

Абстрактная операция BoundFunctionCreate (Создание связанной функции) принимает аргументы targetFunction, boundThis и boundArgs. Она используется для указания создания новых связанных функций экзотических объектов. При вызове она выполняет следующие шаги:

1. Утверждено: Тип(targetFunction) - это Объект.
2. Пусть proto будет ? targetFunction.[[GetPrototypeOf]]().
3. Пусть internalSlotsList будет внутренними слотами, перечисленными в Таблице 31, плюс [[Prototype]] и [[Extensible]].
4. Пусть obj будет ! MakeBasicObject(internalSlotsList).
5. Установите для obj.[[Prototype]] значение proto.
6. Установите obj.[[Call]], как описано в 10.4.1.1.
7. Если IsConstructor(targetFunction) является true (истинно), то
   а. Задайте obj.[[Construct]], как описано в 10.4.1.2.
8. Установите для obj.[[BoundTargetFunction]] значение targetFunction.
9. Установите для obj.[[BoundThis]] значение boundThis.
10. Установите для obj.[[BoundArguments]] значение boundArgs.
11. Вернуть obj.

 

Информационные ссылки

Основной раздел — ECMAScript | Внутренние методы и слоты встроенных экзотических объектов

Стандарт ECMAScript — Раздел «Bound Function Exotic Objects» — https://tc39.es/ecma262/#sec-bound-function-exotic-objects