Экзотический объект пространства имен Модуля — это экзотический объект, который предоставляет привязки, экспортированные из модуля (Module) ECMAScript (см. 16.2.3). Между собственными свойствами с ключом String экзотического объекта пространства имен Модуля и именами привязок, экспортируемых модулем (Module), существует взаимно однозначное соответствие. Экспортируемые привязки включают любые привязки, которые косвенно экспортируются с использованием элементов экспорта export *
. Каждый имеющий значение String собственный ключ свойства является StringValue соответствующего экспортируемого имени привязки. Это единственные свойства экзотического объекта пространства имен Модуля со строковым ключом. Каждое такое свойство имеет атрибуты {[[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false}. Экзотические объекты пространства имен модуля не расширяются.
Объект является «экзотическим объектом пространства имен модуля» (module namespace exotic object), если его [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]], [[HasProperty]], [[Get] ], [[Set]], [[Delete]] и [[OwnPropertyKeys]] внутренние методы используют определения в этом разделе, а его другие важные внутренние методы используют определения из 10.1. Эти методы устанавливаются операцией ModuleNamespaceCreate.
У экзотических объектов пространства имен Модулей есть внутренние слоты, определенные в Таблице 35.
Внутренний слот (Internal Slot) | Тип (Type) | Описание (Description) |
---|---|---|
[[Module]] | Запись Модуля | Запись модуля, экспорт которой предоставляет это пространство имен. |
[[Module]] | Список из String | Список, элементами которого являются строковые значения экспортированных имен, представленных как собственные свойства этого объекта. Список упорядочен так, как если бы массив этих строковых значений был отсортирован с использованием %Array.prototype.sort% с использованием undefined в качестве comparefn. |
[[Prototype]] | Null | Этот слот всегда содержит значение null (см. 10.4.6.1). |
Таблица 35: Внутренние слоты экзотических объектов пространства имен модулей
Экзотические объекты пространства имен Модуля предоставляют альтернативные определения для всех внутренних методов, кроме [[GetPrototypeOf]], который ведет себя, как определено в 10.1.1.
- 10.4.6.1 [[SetPrototypeOf]] ( V )
- 10.4.6.2 [[IsExtensible]] ( )
- 10.4.6.3 [[PreventExtensions]] ( )
- 10.4.6.4 [[GetOwnProperty]] ( P )
- 10.4.6.5 [[DefineOwnProperty]] ( P, Desc )
- 10.4.6.6 [[HasProperty]] ( P )
- 10.4.6.7 [[Get]] ( P, Receiver )
- 10.4.6.8 [[Set]] ( P, V, Receiver )
- 10.4.6.9 [[Delete]] ( P )
- 10.4.6.10 [[OwnPropertyKeys]] ( )
- 10.4.6.11 ModuleNamespaceCreate ( module, exports )
[[SetPrototypeOf]] ( V )
Внутренний метод [[SetPrototypeOf]] экзотического объекта пространства имен модуля — O, принимает аргумент V (Object или null). При вызове он выполняет следующие шаги:
1. Вернуть ? SetImmutablePrototype(O, V).
[[IsExtensible]] ( )
Внутренний метод [[IsExtensible]] экзотического объекта пространства имен модуля не принимает аргументов. При вызове он выполняет следующие шаги:
1. Вернуть false.
[[PreventExtensions]] ( )
Внутренний метод [[PreventExtensions]] экзотического объекта пространства имен модуля не принимает аргументов. При вызове он выполняет следующие шаги:
1. Вернуть true.
[[GetOwnProperty]] ( P )
Внутренний метод [[GetOwnProperty]] экзотического объекта пространства имен модуля — O, принимает аргумент P (ключ свойства). При вызове он выполняет следующие шаги:
1. Если Тип(P) является Символом(Symbol), вернуть OrdinaryGetOwnProperty(O, P). 2. Пусть exports будет O.[[Exports]]. 3. Если P не является элементом exports, вернуть undefined. 4. Пусть value будет ? О.[[Get]](P, O). 5. Вернуть PropertyDescriptor {[[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false} ".
[[DefineOwnProperty]] ( P, Desc )
Внутренний метод [[DefineOwnProperty]] экзотического объекта пространства имен модуля — O, принимает аргументы P (ключ свойства) и Desc (дескриптор свойства). При вызове он выполняет следующие шаги:
1. Если Тип(P) является Символом(Symbol), вернуть OrdinaryDefineOwnProperty(O, P, Desc). 2. Пусть current будет ? О.[[GetOwnProperty]](P). 3. Если current является undefined, вернуть false. 4. Если Desc.[[Configurable]] присутствует и имеет значение true, вернуть false. 5. Если Desc.[[Enumerable]] присутствует и имеет значение false, вернуть false. 6. Если ! IsAccessorDescriptor(Desc) является true, вернуть false. 7. Если Desc.[[Writable]] присутствует и имеет значение false, вернуть false. 8. Если присутствует Desc.[[Value]], вернуть SameValue(Desc.[[Value]], current.[[Value]]). 9. Верните true.
[[HasProperty]] ( P )
Внутренний метод [[HasProperty]] экзотического объекта пространства имен модуля — O, принимает аргумент P (ключ свойства). При вызове он выполняет следующие шаги:
1. Если Тип(P) является Символом(Symbol), верните OrdinaryHasProperty(O, P). 2. Пусть exports будет O.[[Exports]]. 3. Если P является элементом exports, верните true. 4. Вернуть false.
[[Get]] ( P, Receiver )
Внутренний метод [[Get]] экзотического объекта пространства имен модуля — O, принимает аргументы P (ключ свойства) и Receiver (значение языка ECMAScript). При вызове он выполняет следующие шаги:
1. Утверждено: IsPropertyKey(P) является true (истинно). 2. Если Type(P) является Symbol, то а. Вернуть ? OrdinaryGet(O, P, Receiver). 3. Пусть exports будет O.[[Exports]]. 4. Если P не является элементом exports, вернуть undefined. 5. Пусть m равно O.[[Module]]. 6. Пусть привязка binding будет ! m.ResolveExport(P). 7. Утверждено: привязка binding является Запись ResolvedBinding. 8. Пусть targetModule быть binding.[[Module]]. 9. Утверждено: targetModule не является undefined. 10. Если binding.[[BindingName]] равна "*namespace*", тогда а. Возвращаться ? GetModuleNamespace(targetModule). 11. Пусть targetEnv будет targetModule.[[Environment]]. 12. Если targetEnv является undefined, выбросить исключение ReferenceError. 13. Вернуть ? targetEnv.GetBindingValue(binding.[[BindingName]], true).
ResolveExport не имеет побочных эффектов. Каждый раз, когда эта операция вызывается с конкретным параметром exportName, resolveSet в качестве аргументов, она должна возвращать тот же результат. Реализация может выбрать предварительное вычисление или кэширование результатов ResolveExport для [[Exports]] каждого экзотического объекта пространства имен модуля.
[[Set]] ( P, V, Receiver )
Внутренний метод [[Set]] экзотического объекта пространства имен модуля принимает аргументы P (ключ свойства), V (значение языка ECMAScript) и Receiver (значение языка ECMAScript). При вызове он выполняет следующие шаги:
1. Вернуть false.
[[Delete]] ( P )
Внутренний метод [[Delete]] экзотического объекта пространства имен модуля — O, принимает аргумент P (ключ свойства). При вызове он выполняет следующие шаги:
1. Утверждено: IsPropertyKey(P) истинно. 2. Если Type(P) - это Symbol, то а. Вернуть ? Обычное удаление OrdinaryDelete(O, P). 3. Пусть exports будет O.[[Exports]]. 4. Если P является элементом exports, вернуть false. 5. Вернуть true.
[[OwnPropertyKeys]] ( )
Внутренний метод [[OwnPropertyKeys]] экзотического объекта пространства имен модуля — O, не принимает аргументов. При вызове он выполняет следующие шаги:
1. Пусть exports будет копией O.[[Exports]]. 2. Пусть symbolKeys будут ! OrdinaryOwnPropertyKeys(O). 3. Добавьте все записи symbolKeys в конец exports. 4. Вернуть exports.
ModuleNamespaceCreate ( module, exports )
Абстрактная операция ModuleNamespaceCreate (Создание пространства имен модуля) принимает аргументы module и exports. Она используется для указания создания новых экзотических объектов пространства имен модуля. При вызове она выполняет следующие шаги:
1. Утверждено: module - это запись модуля. 2. Утверждено: module.[[Namespace]] является undefined. 3. Утверждено: exports - это Список строковых значений. 4. Пусть internalSlotsList будет внутренними слотами, перечисленными в Таблице 35. 5. Пусть M будет! MakeBasicObject(internalSlotsList). 6. Установите основные внутренние методы M на определения, указанные в 10.4.6. 7. Установите для M.[[Prototype]] значение null. 8. Установите M.[[Module]] на module. 9. Пусть sortedExports будет Списком, элементы которого являются элементами exports, упорядоченными, как если бы массив тех же значений был отсортирован с использованием %Array.prototype.sort% с использованием undefined в качестве comparefn. 10. Установите для M.[[Exports]] значение sortedExports. 11. Создайте собственные свойства M, соответствующие определениям в 28.3. 12. Установите для module.[[Namespace]] значение M. 13. Верните М.
Информационные ссылки
Предыдущий раздел — Экзотические объекты Целочисленного Индекса
Стандарт ECMAScript — Раздел «Module Namespace Exotic Objects» — https://tc39.es/ecma262/#sec-module-namespace-exotic-objects