← 글 목록

notes

Proxy trap + Reflect — 가로채기와 기본 동작

Proxy trap으로 가로채고 Reflect로 기본 동작을 잇는다.

참고: MDN Proxy / Reflect, ECMA-262 Proxy objects

객체의 get/set을 가로채고 싶을 때 Proxy를 쓴다.

trap은 가로채는 훅이고, Reflect는 기본 동작(내부 메서드에 가까운 것)을 함수로 부른다.

flowchart LR
  CALL[obj.x / obj.x=] --> P[Proxy]
  P --> T[trap get/set]
  T -->|기본 유지| R[Reflect.get/set]
  R --> TGT[target]
const target = { n: 1 };
const proxy = new Proxy(target, {
  get(t, prop, receiver) {
    console.log('get', prop);
    return Reflect.get(t, prop, receiver);
  },
  set(t, prop, value, receiver) {
    if (prop === 'n' && typeof value !== 'number') {
      throw new TypeError('n must be number');
    }
    return Reflect.set(t, prop, value, receiver);
  },
});

proxy.n; // 로그 후 1
proxy.n = 2;

trap을 쓸 때 Reflect로 기본 동작을 이어 주면 receiver·프로토타입 위임이 덜 깨진다.

get만 막고 set·has·ownKeys를 안 맞추면 전개·도구가 어긋난다.

실무: 유효성·로깅·읽기 전용 뷰. 남용하면 디버깅 비용이 커진다.

자주 쓰는 trap

get, set, has, deleteProperty, ownKeys, defineProperty, apply, construct…

질문 → 자답

Q. defineProperty로 충분하냐?

A. 기존 키 제어엔 디스크립터. 미래 키·일괄 가로채기는 Proxy.

Q. 반응형이랑 같냐?

A. 반응형 엔진 쪽에 Proxy가 있다. 구독·invariant 설계는 별도다.