Proxy 는 객체를 감싸 해당 객체의 프로퍼티 읽기 또는 쓰기가 발생했을 때 가로채어 새로운 행동을 정의할때 사용합니다.
const proxy = new Proxy(target, handler);
target : 감싸려고 하는 객체handler : 동작을 가로채는 트랩으로 구성된 객체로써 트랩에 해당하는 동작이 수행되었을 때 대체할 행동을 정의객체의 읽기를 가로채어 새로운 행동을 정의한다.
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이 돈 경우 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 |