페이지 표시 설정

28 리플렉션

28.1 Reflect 객체

Reflect 객체는:

  • %Reflect%입니다.
  • 전역 객체의 "Reflect" 프로퍼티의 초기 값입니다.
  • 일반 객체입니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 함수 객체가 아닙니다.
  • [[Construct]] 내부 메서드를 갖지 않으므로 new 연산자와 함께 생성자로 사용할 수 없습니다.
  • [[Call]] 내부 메서드를 갖지 않으므로 함수로 호출할 수 없습니다.

28.1.1 Reflect.apply ( target, thisArg, args )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. IsCallable(target)이 false이면 TypeError 예외를 던집니다.
  2. argList를 ? CreateListFromArrayLike(args)로 둡니다.
  3. PrepareForTailCall()을 수행합니다.
  4. ? Call(target, thisArg, argList)를 반환합니다.

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. IsConstructor(target)가 false이면 TypeError 예외를 던집니다.
  2. newTarget이 존재하지 않으면 newTarget을 target으로 설정합니다.
  3. 그렇지 않고 IsConstructor(newTarget)가 false이면 TypeError 예외를 던집니다.
  4. argList를 ? CreateListFromArrayLike(args)로 둡니다.
  5. ? Construct(target, argList, newTarget)을 반환합니다.

28.1.3 Reflect.defineProperty ( target, key, attrs )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. target이 Object가 아니면 TypeError 예외를 던집니다.
  2. propertyKey를 ? ToPropertyKey(key)로 둡니다.
  3. propertyDesc를 ? ToPropertyDescriptor(attrs)로 둡니다.
  4. ? target.[[DefineOwnProperty]](propertyKey, propertyDesc)를 반환합니다.

28.1.4 Reflect.deleteProperty ( target, key )

이 함수는 호출되면 다음 단계를 수행합니다:

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

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

이 함수는 호출되면 다음 단계를 수행합니다:

  1. target이 Object가 아니면 TypeError 예외를 던집니다.
  2. propertyKey를 ? ToPropertyKey(key)로 둡니다.
  3. receiver가 존재하지 않으면, 다음을 수행합니다.
    1. receiver를 target으로 설정합니다.
  4. ? target.[[Get]](propertyKey, receiver)를 반환합니다.

28.1.6 Reflect.getOwnPropertyDescriptor ( target, key )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. target이 Object가 아니면 TypeError 예외를 던집니다.
  2. propertyKey를 ? ToPropertyKey(key)로 둡니다.
  3. propertyDesc를 ? target.[[GetOwnProperty]](propertyKey)로 둡니다.
  4. FromPropertyDescriptor(propertyDesc)를 반환합니다.

28.1.7 Reflect.getPrototypeOf ( target )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. target이 Object가 아니면 TypeError 예외를 던집니다.
  2. ? target.[[GetPrototypeOf]]()를 반환합니다.

28.1.8 Reflect.has ( target, key )

이 함수는 호출되면 다음 단계를 수행합니다:

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

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, key, value [ , receiver ] )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. target이 Object가 아니면 TypeError 예외를 던집니다.
  2. propertyKey를 ? ToPropertyKey(key)로 둡니다.
  3. receiver가 존재하지 않으면, 다음을 수행합니다.
    1. receiver를 target으로 설정합니다.
  4. ? target.[[Set]](propertyKey, value, receiver)를 반환합니다.

28.1.13 Reflect.setPrototypeOf ( target, proto )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. target이 Object가 아니면 TypeError 예외를 던집니다.
  2. proto가 Object가 아니고 proto가 null도 아니면 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 )

이 함수는 취소 가능한 Proxy 객체를 생성합니다.

호출되면 다음 단계를 수행합니다:

  1. proxy를 ? ProxyCreate(target, handler)로 둡니다.
  2. revokerClosure를 매개변수가 없고 아무것도 캡처하지 않으며 호출될 때 다음 단계를 수행하는 새로운 Abstract Closure로 둡니다:
    1. activeFunc를 활성 함수 객체로 둡니다.
    2. revocableProxy를 activeFunc.[[RevocableProxy]]로 둡니다.
    3. revocableProxy가 null이면 NormalCompletion(undefined)을 반환합니다.
    4. activeFunc.[[RevocableProxy]]를 null로 설정합니다.
    5. 단언: revocableProxy는 Proxy 특수 객체입니다.
    6. revocableProxy.[[ProxyTarget]]을 null로 설정합니다.
    7. revocableProxy.[[ProxyHandler]]를 null로 설정합니다.
    8. NormalCompletion(undefined)을 반환합니다.
  3. revoker를 CreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] »)로 둡니다.
  4. revoker.[[RevocableProxy]]를 proxy로 설정합니다.
  5. result를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  6. ! CreateDataPropertyOrThrow(result, "proxy", proxy)를 수행합니다.
  7. ! CreateDataPropertyOrThrow(result, "revoke", revoker)를 수행합니다.
  8. result를 반환합니다.

28.3 모듈 네임스페이스 객체

모듈 네임스페이스 객체는 모듈의 내보낸 바인딩에 런타임 프로퍼티 기반 접근을 제공하는 모듈 네임스페이스 특수 객체입니다. 모듈 네임스페이스 객체에는 생성자 함수가 없습니다. 대신 NameSpaceImport를 포함하는 ImportDeclaration에 의해 가져온 각 모듈에 대해 그러한 객체가 생성됩니다.

10.4.6에 지정된 프로퍼티에 더하여 각 모듈 네임스페이스 객체에는 다음 자체 프로퍼티가 있습니다:

28.3.1 %Symbol.toStringTag%

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

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.