이 글은 JavaScript의 Proxy에 대한 자세한 소개(코드 예제)를 제공합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
Proxy를 사용하면 모든 개체의 대부분의 동작을 모니터링하고 방해할 수 있으며 보다 맞춤화된 프로그램 동작을 달성할 수 있습니다.
사용법: 새 프록시(대상, 처리기).
Proxy는 동작 수신 방법을 설정하여 해당 객체에 대한 프로그램의 동작을 캡처합니다.
const obj = {}; const proxy = new Proxy(obj, { // ... })
프록시의 생성자는 두 개의 매개변수를 허용합니다. 첫 번째 매개변수는 패키징해야 하는 대상 객체입니다. 두 번째 매개변수는 대상 객체의 동작을 모니터링하는 데 사용되는 리스너입니다. 해당 프로그램 동작을 모니터링하는 일부 매개변수.
청취 속성, 매개변수 및 콘텐츠 모니터링
속성 값 | 청취자 매개변수 | #🎜 🎜 # 듣는 콘텐츠|
---|---|---|
(대상, 소품) | 사용 명령문 듣기 | |
(target, prop, receive) | Listen to the property of the 대상 객체 읽기 | |
(target, prop, value, receive) | 속성 할당 듣기 대상 객체의 | |
(target, prop) | Delete 문의 삭제 속성 동작 듣기 대상 객체에서#🎜 🎜# | |
(target) | Object.getOwnPropertyName() 읽기를 듣습니다. | #🎜🎜 #apply |
대상 함수의 호출 동작 듣기( 대상 개체로) | #🎜 🎜# | construct |
다음 동작 듣기 인스턴스를 생성하기 위해 new를 사용하는 대상 생성자(대상 객체) | getPrototypeOf | |
Objext.getPrototypeOf() | # 🎜🎜#setPrototypeOf | (대상, 프로토타입) |
# 🎜🎜# | isExtensible | (target) |
#🎜 🎜#preventExtensions | (target) | Objext.preventExtensions() 읽기를 들어보세요. |
getOwnPropertyDescriptor# 🎜 🎜# | (target, prop) | Objext.getOwnPropertyDescriptor() 호출 듣기# 🎜 🎜# |
#🎜 🎜#(target, property, descriptor) | Object.defineProperty()에 대한 호출 듣기#🎜🎜 # | |
프록시 처리기가 문자열 또는 숫자인지 확인하는 프로그램 프로세스를 모니터링하기 위해 수신 대기 방법을 정의할 수 있습니다. in 문을 통해 Proxy의 대상 객체에 있는 특정 속성의 속성 키입니다. | 이 청취 방법에 대해 주의해야 할 두 가지 상황이 발생하면 TypeError가 발생합니다. | 1. Object.preventExtensions()를 통해 다른 프로그램에 의해 대상 객체가 비활성화된 경우(객체는 새 속성을 추가할 수 없으며 읽기, 작업 및 삭제를 포함하여 현재 존재하는 속성에서만 작동할 수 있습니다. 그러나 일단 삭제되면 다시 정의할 수 없습니다) 함수이고 확인 중인 속성 키가 대상 객체에 존재하는 경우 청취 메서드는 false를 반환할 수 없습니다. |
const obj = {foo: 1}; const p = new Proxy(obj, { get(target, prop){ console.log(`Program is trying to fetch the property "${prop}".`); return target[prop]; } }) alert(p.foo); // Program is trying to fetch the property "foo". alert(p.something); // Program is trying to fetch the property "something".이 청취 방법에도 주의할 점이 있습니다. 대상 객체의 읽기 속성 중 구성 가능 및 쓰기 가능 속성이 모두 false인 경우 청취 방법에서 반환되는 값은 원본과 동일해야 합니다. 대상 개체의 속성이 일치합니다.
const obj = {}; Object.defineProperty(obj, 'foo', { configurable: false, value: 10, writable: false }) const p = new Proxy(obj, { get(target, prop){ return 20; } }) console.log(p.foo);set —handler.set는 대상 객체의 모든 속성 할당 동작을 모니터링하는 데 사용됩니다. 대상 객체 자체의 속성이 쓰기 가능하지 않거나 구성 가능하지 않은 경우 set은 이 속성의 값을 변경해서는 안 되며 동일한 값만 반환할 수 있습니다. 그렇지 않으면 오류가 보고됩니다.
const obj = {}; const p = new Proxy(obj, { set(target, prop, value){ console.log(`Setting value "${value}" on the key "${prop}" in the target object`); target[prop] = value; return true; } }) p.foo = 1; // Setting value "1" on the key "foo" in the target objectapplyhandler.apply , 프록시는 호출 동작을 모니터링하기 위한 속성이 있는 대상 개체로서의 함수도 제공합니다.
const sum = function(...args) { return args .map(Number) .filter(Boolean) .reduce((a, b) => a + b); } const p = new Proxy(sum, { apply(target, thisArg, args) { console.log(`Function is being called with arguments [${args.join()}] and context ${thisArg}`); return target.call(thisArg, ...args); } }) console.log(p(1, 2, 3)); // Function is being called with arguments [1,2,3] and context undefined // 6construct - handler.construct, 프록시는 클래스를 대상 수신 개체로 사용하고 새 문을 통해 새 인스턴스를 생성하는 동작을 모니터링할 수도 있습니다. 생성자 함수에서 생성자로 다시 사용됩니다.
class Foo{}; const p = new Proxy(Foo, { construct(target, args, newTarget){ return {arguments: args} // 这里返回的结果会是 new 所得到的实例 } }); const obj = new p(1, 2, 3); console.log(obj.arguments); // [1, 2, 3]
const obj = {foo: 10}; const revocable = Proxy.revocable(obj, { get(target, prop){ return 20; } }) const proxy = revocable.proxy; console.log(proxy.foo); // 20 revocable.revoke(); console.log(proxy.foo); // TypeError: Cannot perform 'get' on a proxy that has been revoked
위 내용은 JavaScript의 프록시에 대한 자세한 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!