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 |