28 리플렉션

28.1 Reflect 객체

Reflect 객체:

  • %Reflect%이다.
  • 전역 객체"Reflect" 프로퍼티의 초기 값이다.
  • ordinary object이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • function object가 아니다.
  • [[Construct]] 내부 메서드를 가지지 않는다; new 연산자와 함께 생성자로 사용할 수 없다.
  • [[Call]] 내부 메서드를 가지지 않는다; 함수로 호출할 수 없다.

28.1.1 Reflect.apply ( target, thisArgument, argumentsList )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. IsCallable(target)이 false이면, TypeError 예외를 던진다.
  2. args를 ? CreateListFromArrayLike(argumentsList)로 둔다.
  3. PrepareForTailCall()을 수행한다.
  4. Call(target, thisArgument, args)를 반환한다.

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

이 함수는 호출될 때 다음 단계를 수행한다:

  1. IsConstructor(target)가 false이면, TypeError 예외를 던진다.
  2. newTarget이 존재하지 않으면, newTargettarget으로 설정한다.
  3. 그렇지 않고 IsConstructor(newTarget)가 false이면, TypeError 예외를 던진다.
  4. args를 ? CreateListFromArrayLike(argumentsList)로 둔다.
  5. Construct(target, args, newTarget)를 반환한다.

28.1.3 Reflect.defineProperty ( target, propertyKey, attributes )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. key를 ? ToPropertyKey(propertyKey)로 둔다.
  3. desc를 ? ToPropertyDescriptor(attributes)로 둔다.
  4. target.[[DefineOwnProperty]](key, desc)를 반환한다.

28.1.4 Reflect.deleteProperty ( target, propertyKey )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. key를 ? ToPropertyKey(propertyKey)로 둔다.
  3. target.[[Delete]](key)를 반환한다.

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

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. key를 ? ToPropertyKey(propertyKey)로 둔다.
  3. receiver가 존재하지 않으면,
    1. receivertarget으로 설정한다.
  4. target.[[Get]](key, receiver)를 반환한다.

28.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. key를 ? ToPropertyKey(propertyKey)로 둔다.
  3. desc를 ? target.[[GetOwnProperty]](key)로 둔다.
  4. FromPropertyDescriptor(desc)를 반환한다.

28.1.7 Reflect.getPrototypeOf ( target )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. target.[[GetPrototypeOf]]()를 반환한다.

28.1.8 Reflect.has ( target, propertyKey )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. key를 ? ToPropertyKey(propertyKey)로 둔다.
  3. target.[[HasProperty]](key)를 반환한다.

28.1.9 Reflect.isExtensible ( target )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. target.[[IsExtensible]]()를 반환한다.

28.1.10 Reflect.ownKeys ( target )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. keys를 ? target.[[OwnPropertyKeys]]()로 둔다.
  3. CreateArrayFromList(keys)를 반환한다.

28.1.11 Reflect.preventExtensions ( target )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. target.[[PreventExtensions]]()를 반환한다.

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

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. key를 ? ToPropertyKey(propertyKey)로 둔다.
  3. receiver가 존재하지 않으면,
    1. receivertarget으로 설정한다.
  4. target.[[Set]](key, value, receiver)를 반환한다.

28.1.13 Reflect.setPrototypeOf ( target, proto )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. target이 Object가 아니면, TypeError 예외를 던진다.
  2. proto가 Object가 아니고 protonull도 아니면, TypeError 예외를 던진다.
  3. target.[[SetPrototypeOf]](proto)를 반환한다.

28.1.14 Reflect [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "Reflect"이다.

이 프로퍼티는 속성 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }를 가진다.

28.2 Proxy 객체

28.2.1 Proxy 생성자

Proxy 생성자:

  • %Proxy%이다.
  • 전역 객체"Proxy" 프로퍼티의 초기 값이다.
  • 생성자로 호출될 때 새로운 Proxy 객체를 생성하고 초기화한다.
  • 함수로 호출되도록 의도되지 않았으며, 그런 방식으로 호출되면 예외를 던진다.

28.2.1.1 Proxy ( target, handler )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget이 undefined이면, TypeError 예외를 던진다.
  2. ProxyCreate(target, handler)를 반환한다.

28.2.2 Proxy 생성자의 프로퍼티

Proxy 생성자:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • Proxy 객체에는 초기화가 필요한 [[Prototype]] 내부 슬롯이 없기 때문에 "prototype" 프로퍼티를 가지지 않는다.
  • 다음 프로퍼티를 가진다:

28.2.2.1 Proxy.revocable ( target, handler )

이 함수는 revocable Proxy 객체를 생성한다.

호출될 때 다음 단계를 수행한다:

  1. proxy를 ? ProxyCreate(target, handler)로 둔다.
  2. revokerClosure를 아무것도 캡처하지 않고 호출될 때 다음 단계를 수행하는, 매개변수가 없는 새로운 Abstract Closure로 둔다:
    1. activeFuncactive function object로 둔다.
    2. pactiveFunc.[[RevocableProxy]]로 둔다.
    3. pnull이면, NormalCompletion(undefined)를 반환한다.
    4. activeFunc.[[RevocableProxy]]null로 설정한다.
    5. Assert: p는 Proxy exotic object이다.
    6. p.[[ProxyTarget]]null로 설정한다.
    7. p.[[ProxyHandler]]null로 설정한다.
    8. NormalCompletion(undefined)를 반환한다.
  3. revokerCreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] »)로 둔다.
  4. revoker.[[RevocableProxy]]proxy로 설정한다.
  5. resultOrdinaryObjectCreate(%Object.prototype%)로 둔다.
  6. CreateDataPropertyOrThrow(result, "proxy", proxy)를 수행한다.
  7. CreateDataPropertyOrThrow(result, "revoke", revoker)를 수행한다.
  8. result를 반환한다.

28.3 Module Namespace 객체

Module Namespace Object는 모듈의 export된 binding에 대해 런타임 프로퍼티 기반 접근을 제공하는 module namespace exotic object이다. Module Namespace Object에는 생성자 함수가 없다. 대신, 그러한 객체는 NameSpaceImport를 포함하는 ImportDeclaration에 의해 import되는 각 모듈에 대해 생성된다.

10.4.6에 지정된 프로퍼티 외에도 각 Module Namespace Object는 다음 own 프로퍼티를 가진다:

28.3.1 %Symbol.toStringTag%

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "Module"이다.

이 프로퍼티는 속성 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }를 가진다.