js高级程序设计阅读第九章-代理

54 阅读1分钟

捕获器参数

get()捕获器会接收到目标对象、要查询的属性和代理对象三个参数。

const target = {
foo: 'bar'
};
const handler = {
    get(trapTarget, property, receiver) {
        console.log(trapTarget === target);
        console.log(property);
        console.log(receiver === proxy);
    }
};
const proxy = new Proxy(target, handler);
proxy.foo;
// true 
// foo 
// true 

反射api

const target = {
foo: 'bar'
};
const handler = {
    get() {
        return Reflect.get(...arguments);
    }
};

或者
//const handler = { get: Reflect.get };
//const proxy = new Proxy(target, Reflect);    
const proxy = new Proxy(target, handler);
console.log(proxy.foo); // bar 
console.log(target.foo); // bar

撤销代理

 revocable创建一个允许撤销的代理 撤销后不可逆
 revoke()撤销代理
 
 const target = { 
 foo: 'bar' 
}; 
const handler = { 
 get() { 
 return 'intercepted'; 
 } 
}; 
const { proxy, revoke } = Proxy.revocable(target, handler); 
console.log(proxy.foo); // intercepted 
console.log(target.foo); // bar 
revoke(); 
console.log(proxy.foo); // TypeError 

反射api以下反射方法都会提供状态标记:

Reflect.defineProperty()
 Reflect.preventExtensions()
 Reflect.setPrototypeOf()
 Reflect.set()
 Reflect.deleteProperty()

用一等函数替代操作符

以下反射方法提供只有通过操作符才能完成的操作。
 Reflect.get():可以替代对象属性访问操作符。
 Reflect.set():可以替代=赋值操作符。
 Reflect.has():可以替代 in 操作符或 with()。
 Reflect.deleteProperty():可以替代 delete 操作符。
 Reflect.construct():可以替代 new 操作符