Экзотический объект связанной функции (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: Внутренние слоты связанных функций экзотических объектов
- 10.4.1.1 [[Call]] ( thisArgument, argumentsList )
- 10.4.1.2 [[Construct]] ( argumentsList, newTarget )
- 10.4.1.3 BoundFunctionCreate ( targetFunction, boundThis, boundArgs )
[[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