1 minute read

  • 객체가 어떤 작업 할 떄 JS 명세서에 정의된 ‘내부 메서드’ 가 관여 (명세서에 정의된 메서드라 개발자가 코드 직접 호출 불가능)

  • Proxy 는 특정 객체를 감싸 객체에 가해지는 ‘내부 메서드’를 중간에서 가로채는 객체 (래퍼 객체)

  • 가로채진 작업은 Proxy 자체에서 처리되거나 원래 객체가 처리하도록 그대로 전달

  • new Proxy(target, handler) 로 생성하며 target 은 감싸게 될 객체(함수 포함 모든 객체 가능), handler 는 동작을 가로채는 메서드인 ‘트랩(trap)’ 이 담긴 객체

  • proxy에 작업 가해지고 handler 에 상응하는 트앱이 있으면 트랩이 실행되어 proxy 가 이 작업 처리할 기회 얻게 됨.

  • handler의 매개변수에 추가할 수 있는 메서드는 정해져 있음

  • 내부 메서드나 트랩을 쓸 땐 JS에서 정한 규칙(조건)을 따라야 함

  • 규칙은 JS가 일관된 동작을 하고 잘못된 동작을 교정해주는 역할

  • 조건은 반환 값과 관련되어있음 ([[Set]]은 반드시 true 반환, [[Delte]]는 성공 여부에 따른 true/false 반환)

  • 프로퍼티 읽는 작업은 get(target, property, receiver) 로 가로챌 수 있으며 target은 동작을 전달할 객체, property는 프로퍼티 이름, receiver는 호출할 때의 this

  • 메서드에서 프로퍼티 접근하려는 작업도 할 수 있으므로 원본 객체인 target 에 바인딩 작업 해야 함

  • 타깃 객체의 위치와 상관없이 프락시 객체는 타깃 객체 덮어써야 하며 덮어쓴 후엔 타깃 객체를 참조하는 코드 없어야 함

  • 프로퍼티 쓰려는 작업은 set(target, property, value, receiver) 로 가로챌 수 있으며 target은 동작을 전달할 객체, value는 프로퍼티 값, property는 프로퍼티 이름, receiver는 호출할 때의 this이며 return 값으로 true/false 가져야 함

  • 프로퍼티 순회(반복문)하려는 작업은 ownKeys(target) 로 가로챌 수 있으며 target은 동작을 전달할 객체이며 target 객체는 프로퍼티 설명자가 있어야 하며 enumerable 플래그 가지고 있어야 동작함

  • 프로퍼티 설명자 접근하려는 작업은 getOwnPropertyDescriptor(target, prop) 로 가로챌 수 있으며 target은 동작을 전달할 객체, prop은 property 이름이며 return 값으로 플래그 반환해야 함

  • 프로퍼티 삭제하려는 작업은 deleteProperty(target, prop) 로 가로챌 수 있으며 target은 동작을 전달할 객체, prop은 프로퍼티 이름이며 해당 프로퍼티에 접근하려 할 때 throw error/return true 해야 함

  • in 호출하는 작업은 has(target, property) 로 가로챌 수 있으며 target은 타깃 객체, property는 프로퍼티 이름

  • proxy를 함수처럼 호출하려는 작업은 apply(target, thisArg, args 로 가로챌 수 있으며 target은 타깃 객체(JS에서 함수는 객체), thisArg 는 this 의 값, args는 인수 목록을 나타냄

  • 클래스내에서 private 프로퍼티 사용 시 해당 proxy없이 프로퍼티 보호할 수 있지만 상속이 불가능하다는 단점 있음

  • Reflect 추가 필요

Categories: ,

Updated: