proxy

2021.12.31
#xxx#xxx
use client /components/post/reExport , date: , tags: [ ], imgUrl: , desc: [ ], body: ( <> <ul> <li>Proxy - object wraps another object and intercepts operations, like reading/writing properties</li> <li>Proxy provide a way to tweak the behavior of the existing objects at the lowest level</li> <li>Proxy is more powerful than just a fn wrapper, as it forwards everything to the target object</li> </ul> <H>Syntax</H> <p> <Code>let proxy = new Proxy(target, handler)</Code> <br /> <code>target</code> - object to wrap, can be anything, including functions <br /> <code>handler</code> – proxy configuration: an object with “traps”, methods that intercept operations </p> <H>Handler methods</H> <p> Triggers when <br /> <code>get</code> - reading a property <br /> <code>set</code> - writing to a property <br /> <code>has</code> - in operator <br /> <code>deleteProperty</code> - delete operator <br /> <code>apply</code> - function call <br /> <code>construct</code> - new operator <br /> <code>getPrototypeOf</code> - <code>Object.getPrototypeOf</code> <br /> <code>setPrototypeOf</code> - <code>Object.setPrototypeOf</code> <br /> <code>isExtensible</code> - <code>Object.isExtensible</code> <br /> <code>preventExtensions</code> - <code>Object.preventExtensions</code> <br /> <code>defineProperty</code> - <code>Object.defineProperty</code>, <code>Object.defineProperties</code> <br /> <code>getOwnPropertyDescriptor</code> - <code>Object.getOwnPropertyDescriptor</code>, <code>for...in</code>, <code>Object.keys/values/entries</code> <br /> <code>ownKeys</code> - <code>Object.getOwnPropertyNames</code>, <code>Object.getOwnPropertySymbols</code>, <code>for...in</code>, <code> Object.keys/values/entries</code> <br /> </p> <H>No own properties</H> <p>With an empty handler it transparently forwards operations to target</p> <Code block jsx>{ }</Code> <H>Get trap</H> <p>Get trap triggers when a property is read</p> <Code block jsx>{ }</Code> <Code block jsx>{ , } dictionary = new Proxy(dictionary, { get(target, phrase) { if (phrase in target) return target[phrase] return } } ) dictionary[ ] // Hola dictionary[ ] // no translation let numbers = [] numbers = new Proxy(numbers, { set(target, prop, val) { // to intercept property writing if (typeof val !== ) return false target[prop] = val; return true } }) numbers.push(1) // added successfully numbers.push(2) // added successfully numbers.push( ) // TypeError ( on proxy returned false) numbers // Proxy {0: 1, 1: 2} </p> <Code block jsx>{ , age: 30, _password: } user = new Proxy(user, { ownKeys(target) { return Object.keys(target).filter(key => !key.startsWith( )); } }) for(let key in user) alert(key); // name, age Object.keys(user) // [ ] Object.values(user) // [ , 30] function delay(f, ms) { return new Proxy(f, { apply(target, thisArg, args) { setTimeout(() => target.apply(thisArg, args), ms) } }) } function sayHi(user) { alert(\ ) } sayHi = delay(sayHi, 3000) sayHi.length // 1 // proxy forwards operation to the target sayHi( ); // Hello, John! (after 3 seconds)