ECMAScript | Экзотические объекты Пространства имён Модуля

ECMAScript | Экзотические объекты Пространства имён Модуля

 

Экзотический объект пространства имен Модуля — это экзотический объект, который предоставляет привязки, экспортированные из модуля (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.

 

[[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