# ECMAScript® 2026 Language Specification
Introduction This Ecma Standard defines the ECMAScript 2026 Language. It is the seventeenth edition of the ECMAScript Language Specification. ECMAScript is based on several originating technologies, the most well-known being JavaScript (Netscape) and JScript (Microsoft). The language was invent

# 28 Reflection

# 28.1 The Reflect Object

The Reflect object:

- is %Reflect%.
- is the initial value of the "Reflect" property of the global object.
- is an ordinary object.
- has a [[Prototype]] internal slot whose value is %Object.prototype%.
- is not a function object.
- does not have a [[Construct]] internal method; it cannot be used as a constructor with the `new` operator.
- does not have a [[Call]] internal method; it cannot be invoked as a function.

# 28.1.1 Reflect.apply ( target, thisArgument, argumentsList )

This function performs the following steps when called:

1. If IsCallable(target) is false, throw a TypeError exception.
2. Let args be ? CreateListFromArrayLike(argumentsList).
3. Perform PrepareForTailCall().
4. Return ? Call(target, thisArgument, args).

# 28.1.2 Reflect.construct ( target, argumentsList [ , newTarget ] )

This function performs the following steps when called:

1. If IsConstructor(target) is false, throw a TypeError exception.
2. If newTarget is not present, set newTarget to target.
3. Else if IsConstructor(newTarget) is false, throw a TypeError exception.
4. Let args be ? CreateListFromArrayLike(argumentsList).
5. Return ? Construct(target, args, newTarget).

# 28.1.3 Reflect.defineProperty ( target, propertyKey, attributes )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Let key be ? ToPropertyKey(propertyKey).
3. Let desc be ? ToPropertyDescriptor(attributes).
4. Return ? target.[[DefineOwnProperty]](key, desc).

# 28.1.4 Reflect.deleteProperty ( target, propertyKey )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Let key be ? ToPropertyKey(propertyKey).
3. Return ? target.[[Delete]](key).

# 28.1.5 Reflect.get ( target, propertyKey [ , receiver ] )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Let key be ? ToPropertyKey(propertyKey).
3. If receiver is not present, then
   1. Set receiver to target.
4. Return ? target.[[Get]](key, receiver).

# 28.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Let key be ? ToPropertyKey(propertyKey).
3. Let desc be ? target.[[GetOwnProperty]](key).
4. Return FromPropertyDescriptor(desc).

# 28.1.7 Reflect.getPrototypeOf ( target )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Return ? target.[[GetPrototypeOf]]().

# 28.1.8 Reflect.has ( target, propertyKey )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Let key be ? ToPropertyKey(propertyKey).
3. Return ? target.[[HasProperty]](key).

# 28.1.9 Reflect.isExtensible ( target )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Return ? target.[[IsExtensible]]().

# 28.1.10 Reflect.ownKeys ( target )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Let keys be ? target.[[OwnPropertyKeys]]().
3. Return CreateArrayFromList(keys).

# 28.1.11 Reflect.preventExtensions ( target )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Return ? target.[[PreventExtensions]]().

# 28.1.12 Reflect.set ( target, propertyKey, V [ , receiver ] )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. Let key be ? ToPropertyKey(propertyKey).
3. If receiver is not present, then
   1. Set receiver to target.
4. Return ? target.[[Set]](key, V, receiver).

# 28.1.13 Reflect.setPrototypeOf ( target, proto )

This function performs the following steps when called:

1. If target is not an Object, throw a TypeError exception.
2. If proto is not an Object and proto is not null, throw a TypeError exception.
3. Return ? target.[[SetPrototypeOf]](proto).

# 28.1.14 Reflect [ %Symbol.toStringTag% ]

The initial value of the %Symbol.toStringTag% property is the String value "Reflect".

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.

# 28.2 Proxy Objects

# 28.2.1 The Proxy Constructor

The Proxy constructor:

- is %Proxy%.
- is the initial value of the "Proxy" property of the global object.
- creates and initializes a new Proxy object when called as a constructor.
- is not intended to be called as a function and will throw an exception when called in that manner.

# 28.2.1.1 Proxy ( target, handler )

This function performs the following steps when called:

1. If NewTarget is undefined, throw a TypeError exception.
2. Return ? ProxyCreate(target, handler).

# 28.2.2 Properties of the Proxy Constructor

The Proxy constructor:

- has a [[Prototype]] internal slot whose value is %Function.prototype%.
- does not have a "prototype" property because Proxy objects do not have a [[Prototype]] internal slot that requires initialization.
- has the following properties:

# 28.2.2.1 Proxy.revocable ( target, handler )

This function creates a revocable Proxy object.

It performs the following steps when called:

1. Let proxy be ? ProxyCreate(target, handler).
2. Let revokerClosure be a new Abstract Closure with no parameters that captures nothing and performs the following steps when called:
   1. Let F be the active function object.
   2. Let p be F.[[RevocableProxy]].
   3. If p is null, return NormalCompletion(undefined).
   4. Set F.[[RevocableProxy]] to null.
   5. Assert: p is a Proxy exotic object.
   6. Set p.[[ProxyTarget]] to null.
   7. Set p.[[ProxyHandler]] to null.
   8. Return NormalCompletion(undefined).
3. Let revoker be CreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] »).
4. Set revoker.[[RevocableProxy]] to proxy.
5. Let result be OrdinaryObjectCreate(%Object.prototype%).
6. Perform ! CreateDataPropertyOrThrow(result, "proxy", proxy).
7. Perform ! CreateDataPropertyOrThrow(result, "revoke", revoker).
8. Return result.

# 28.3 Module Namespace Objects

A Module Namespace Object is a module namespace exotic object that provides runtime property-based access to a module's exported bindings. There is no constructor function for Module Namespace Objects. Instead, such an object is created for each module that is imported by an ImportDeclaration that contains a NameSpaceImport.

In addition to the properties specified in 10.4.6 each Module Namespace Object has the following own property:

# 28.3.1 %Symbol.toStringTag%

The initial value of the %Symbol.toStringTag% property is the String value "Module".

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.