代理
代理是对象的访问控制,使用代理的好处。
- 读写属性时代码更简洁
- 对象的多个属性控制统一交给代理完成
反射
代理拦截行为使用了一个能够响应特定操作的函数( 被称为陷阱),每个代理陷阱对应一个反射(Reflect)方法。
ES6 的反射 API 以 Reflect 对象的形式出现,对象每个方法都与对应的陷阱函数同名,并且接收的参数也与之一致。以下是 Reflect 对象的一些方法:
代理函数 | 特性 | 反射方法 |
---|---|---|
get | 读取一个属性的值 | Reflect.get() |
set | 写入一个属性 | Reflect.set() |
has | in 运算符 | Reflect.has() |
deleteProperty | delete 运算符 | Reflect.deleteProperty() |
getPrototypeOf | Object.getPrototypeOf() | Reflect.getPrototypeOf() |
isExtensible | Object.isExtensible() | Reflect.isExtensible() |
defineProperty | Object.defineProperty() | Reflect.defineProperty |
apply | 调用一个函数 | Reflect.apply() |
construct | 使用 new 调用一个函数 | Reflect.construct() |
实现一个简单的代理
需求:读取一个属性的时候添加 !
var target= {name: "js"};
var proxy = new Proxy(target,{
get(target,property,receiver) {
var decs = '';
if(property == "name"){
decs = '!';
}
return Reflect.get(...arguments) + decs;
}
});
console.log(proxy.name);
输出:js!