目录
Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
proxy在目标对象的外层搭建了一层拦截,外界对目标对象的某些操作(后文会说明,有哪些操作可以拦截),必须通过这层拦截。
var proxy = new Proxy(target, handler);
target
要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
handler
一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理的行为。
注意:当我们配置好代理后,应该避免操作 原对象 ,而是操作 配置好的代理对象
- let obj = {...}
- let proxy = new Proxy(obj,{...})
比如现在我们需要操作 proxy 而不是 obj
拦截对象的读取属性操作。
三个参数:
target: 目标对象,
property: 被获取的属性名,
receiver: Proxy 或者继承 Proxy 的对象
函数中 return 的是读取对象属性时 拿到的值:正常返回如下
- var per = new Proxy({name:"张三",age:16}, {
- get: function(target, property, receiver) {
- return target[property]
- }
- });
比如他的年龄不到 18 不让他读取值
- var per = new Proxy({name:"张三",age:16}, {
- get: function(target, property, receiver) {
- if(target.age < 18){
- return "未成年"
- }
- return target[property]
- }
- });
拦截设置属性值操作 包括新增 修改
四个参数:
target: 目标对象,
property: 被获取的属性名,
value: 新属性值,
receiver: Proxy 或者继承 Proxy 的对象
函数中 return 的是是否修改成功,修改成功需要 return true 否则 返回 false
在严格模式下,如果 set() 方法返回 false,那么会抛出一个 异常。
- let proxy = new Proxy({name:"张三",age:16},{
- set(target,property,value){
- if(property == 'name'&&target.age< 18){
- console.log("未成年人不允许改名字");
- } else { target[property] = value }
- }
- })