JavaScript의 프록시 객체
9384 단어 programmingjavascript
프록시 개체 만들기
프록시 개체를 만들려면 먼저 대상 개체와 처리기 개체의 두 가지가 필요합니다. 대상은 프록시를 만들고자 하는 개체이며 핸들러는 변경할 동작과 변경 방법을 정의하는 위치입니다. 이러한 두 개체를 모두 정의한 후 target 및 handler를 이름을 지정한 것으로 대체하는 변수 세트
new Proxy(target, handler)
를 만들어 프록시를 만들 수 있습니다.const target = {
greetingOne: "hello",
greetingTwo: "world",
};
const handler = {};
const proxy = new Proxy(target, handler);
지금은 핸들러를 비워 두었습니다. 즉, 동작이 변경되지 않습니다. 이것은 그다지 유용하지 않으므로 다음으로 프록시의 일부 동작을 변경할 수 있는 방법을 살펴보겠습니다.
Get 메서드 변경
greetingTwo
가 'world'와 같은 경우 프록시target.greetingTwo
를 'dev.to'로 변경하기를 원한다고 가정해 보겠습니다. 이를 위해 핸들러 개체에서 get 메서드를 재정의하여 정상적인 동작을 덮어씁니다. target, prop 및 receiver를 get()
함수에 전달한 다음 해당 매개 변수를 사용하여 동작을 변경해야 합니다.const target = {
greetingOne: "hello",
greetingTwo: "world",
};
const handler = {
get(target, prop, receiver) {
if (prop === "greetingTwo") {
return "dev.to";
}
return Reflect.get(...arguments);
},
};
const proxy = new Proxy(target, handler);
console.log(proxy.greetingTwo); // dev.to
Reflect
를 사용하면 일부 접근자에 대한 원래 동작을 유지하고 변경하려는 값만 변경할 수 있습니다.설정 방법 변경
객체에서 특정 값만 유효하게 하려면 어떻게 해야 합니까? 이를 달성하기 위해 핸들러에서
set()
를 사용할 수 있습니다. 이번에는 개체, 소품 및 값을 전달하고 매개 변수를 사용하여 데이터가 유효한지 확인합니다.const target = {
value: 1,
};
const handler = {
set(obj, prop, value) {
if (prop === "value" && value < 1) {
console.log("value cannot be lower than 1");
// handle error
} else {
return Reflect.set(...arguments);
}
},
};
const proxy = new Proxy(target, handler);
proxy.value = 0; // 'value cannot be lower than 1'
console.log(proxy.value); // 1
proxy.value = 3;
console.log(proxy.value); // 3
다시 말하지만
Reflect
를 사용하면 원하는 경우 정상적인 동작을 유지할 수 있습니다. proxy.value
를 1보다 작은 숫자로 설정하려고 하면 경고가 콘솔에 기록되고 값이 설정되지 않습니다. 1 이상의 값은 여전히 유효합니다.다른 방법 가로채기
이 게시물을 짧고 간결하게 유지하기 위해 각 개별 핸들러 트랩을 다루지는 않을 것입니다. 11개가 더 있지만 몇 개만 보여드리겠습니다. MDN에는 그들 모두에 대한 예제가 있으며 더 많은 예제와 더 자세한 설명을 찾고 있다면 문서를 빠르게 읽을 것을 권장합니다.
apply()
apply()
를 사용하면 함수 호출이 트랩됩니다. apply()
를 호출합니다. apply: function(target, thisArg, argList){}
기존 함수에 추가하여 함수 작동 방식을 변경할 수 있습니다.
construct()
construct(target, args)
를 사용하면 'new' 키워드가 트랩됩니다. has()
has(target, key)
를 사용하는 것은 in
연산자in
연산자를 통해 키에 액세스하는 방식의 동작을 변경할 수 있습니다. if (key === "keyOne") {
return false;
}
return key in target;
deleteProperty()
deleteProperty(target, property)
를 사용하면 delete
연산자 delete proxy.keyOne; // gets trapped in the handler object
이 게시물에서는 그렇게 할 것입니다. 질문이 있으시면 의견에 최선을 다해 답변해 드리겠습니다.
Reference
이 문제에 관하여(JavaScript의 프록시 객체), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kadeesterline/proxy-objects-in-javascript-1ajo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)