자바스크립트 Proxy

맨날·2022년 9월 20일
0
post-custom-banner

Proxy

Proxy 는 객체를 감싸 해당 객체의 프로퍼티 읽기 또는 쓰기가 발생했을 때 가로채어 새로운 행동을 정의할때 사용합니다.

Proxy 문법

const proxy = new Proxy(target, handler);
  • target : 감싸려고 하는 객체
  • handler : 동작을 가로채는 트랩으로 구성된 객체로써 트랩에 해당하는 동작이 수행되었을 때 대체할 행동을 정의

Get

객체의 읽기를 가로채어 새로운 행동을 정의한다.

const handler = {
	get(target, name) {
		return name in target 
			? target[name]
			: 17;
	}
};

const p = new Proxy({}, handler);
p.a = 1;

console.log(p.a); // 1
console.log(p.b); // 17
  • target : 대상 객체
  • name : 읽기 동작을 수행한 프로퍼티명

Set

객체의 쓰기를 가로채어 새로운 행동을 정의한다. 보통 데이터의 검증에 사용된다. 정상적으로 Set이 돈 경우 true를 반환해 주어야 한다.

const handler = {
	set(target, name, value) {
		if (name !== 'num') return;
		target.total += value;
	}
};

const p = new Proxy({ total: 0 }, handler);
p.num = 1;
p.num = 2;
p.num = 3;

console.log(p.total);
  • target : 대상 객체
  • name : 쓰기 동작을 수행한 프로퍼티명
  • value : 쓰기 동작시 할당한 값

객체의 기본 동작

handler에 트랩을 정의하지 않으면 객체의 기본 동작으로 작동한다.

const p = new Proxy({}, {});
p.a = 37;
console.log(p.a); // 37

get와 set 이외에도 추가적인 트랩이 존재한다.

내부 메서드핸들러 메서드
[[Get]]get
[[Set]]set
[[HasProperty]]has
[[Delete]]deleteProperty
[[Call]]apply
[[Construct]]construct
[[GetPrototypeOf]]getPrototypeOf
[[SetPrototypeOf]]setPrototypeOf
[[IsExtensible]]isExtensible
[[PreventExtensions]]preventExtensions
[[DefineOwnProperty]]defineProperty
[[GetOwnProperty]]getOwnPropertyDescriptor
[[OwnPropertyKeys]]ownKeys
post-custom-banner

0개의 댓글