Proxy와 Reflect

Proxy와 Reflect

🍊 Proxy Objects

Proxy 객체는 다른 객체의 proxy를 만드는데, 그 객체의 기초적인 operation을 가로채서 재정의한다.

Description

  • constructor로 호출되면, Proxy exotic objecr를 생성하고 초기화한다.

  • function으로서 호출되도록 의도되지 않았다. 만약, proxy를 함수처럼 호출하면 exeption이 던져진다.

Proxy Constructor

  • [[Prototype]]이 내부적으로 있고, 그 값은 Function.prototype이다.

  • prototype 프로퍼티를 갖고 있지 않다. Proxy exotic objects가 초기화하는데 필요한 [[Prototype]]을 내부적으로 갖고 있지 않기 때문이다.

  • 참고 : [[Prototype]] vs prototype 프로퍼티

    • [[Prototype]] : __proto__

      • 객체는 생성자의 프로토타입 객체를 가리킨다.

      • 함수 객체는 Function.prototype을 가리킨다.

    • prototype 프로퍼티

      • 함수객체만 갖고 있는 프로퍼티이다.

      • 프로토타입 객체(Prototype Object)를 가리킨다.

Proxy ( target, handler )

Proxy는 두 파라미터로 만들어진다.

  • target : proxy하고 싶은 원래의 객체

  • handler : 어떠한 operation을 가져와서, 어떻게 재정의할 것인지를 정의한 객체

프록시 핸들러 메서드는 Proxy Handler - MDN 문서를 참고하자.

handler.construct()

handler.construct()메서드는 new operator를 가로챈다.

handler.apply()

handler.apply()는 함수 호출을 가로챈다.

예제

Proxy를 사용할 때, this binding이 까다로운 부분이다. 어떠한 메소드이건 this가 Proxy에 바인딩 되어, intercept할 수 있기를 바란다. ES6에서 Reflect라는 새로운 기능이 추가되었고, 이것이 이 문제를 해결해준다.

🍊 Reflect Object

Reflect는 자바스크립트 operation을 가로챌 수 있는 메소드를 제공하는 빌트인객체이다. proxy handler와 같은 메소드를 제공한다.

Description

  • Reflect는 일반적인 객체이다.

  • 함수 객체가 아니다 => constructible 하지 않ㄴ다.

  • Reflect 내부에는 [[Construct]] method가 내부에 없다 => new operator를 사용하여 constructor로 사용할 수 없다.

  • Reflect는 [[Call]] internal method가 없다 => 함수처럼 호출될 수 없다.

  • 모든 Reflect의 메소드와 프로퍼티는 static하다.

출처

Last updated