关键词:proxy set 拦截器
target
参数- 含义:它是被代理的目标对象。这个对象是原始的、即将被操作(在
set
操作的情境下是被设置属性值)的对象。例如,如果你创建了一个代理来拦截对某个对象属性的设置操作,target
就是那个实际拥有属性的原始对象。 - 示例:
在这个例子中,
let targetObj = { name: "John" }; let proxyObj = new Proxy(targetObj, { set(target, property, value) { // 这里的target就是targetObj console.log(`正在设置${target}对象的${property}属性为${value}`); target[property] = value; return true; }, }); proxyObj.age = 30;
target
在proxyObj.age = 30
这个操作中,就是targetObj
,它是被代理的基础对象,set
拦截器可以对这个对象的属性设置操作进行监控和修改。
- 含义:它是被代理的目标对象。这个对象是原始的、即将被操作(在
property
参数- 含义:它表示要设置的属性名。在对象操作中,当你通过
obj[key] = value
或者obj.property = value
这样的方式设置属性时,property
就是那个key
或者property
。这个参数让拦截器知道具体是哪个属性正在被操作。 - 示例:
在这里,当尝试设置
let targetObj = { name: "John" }; let proxyObj = new Proxy(targetObj, { set(target, property, value) { if (property === "age" && typeof value !== "number") { throw new Error("年龄必须是数字"); } target[property] = value; return true; }, }); proxyObj.age = "abc";
proxyObj.age
时,property
的值就是'age'
,拦截器可以根据这个属性名来进行特定的验证(如这里检查年龄是否为数字)。
- 含义:它表示要设置的属性名。在对象操作中,当你通过
value
参数- 含义:它是要设置给属性的新值。在
obj[key]=value
或者obj.property = value
这样的操作中,value
就是等号右边的值。拦截器可以获取这个值来决定是否允许设置,或者对这个值进行转换等操作。 - 示例:
在这个例子中,当设置
let targetObj = { name: "John" }; let proxyObj = new Proxy(targetObj, { set(target, property, value) { if (typeof value === "string") { value = value.toUpperCase(); } target[property] = value; return true; }, }); proxyObj.name = "jane"; console.log(targetObj.name);
proxyObj.name
时,value
最初是'jane'
,拦截器将其转换为大写'JANE'
后再设置到targetObj
的name
属性中,最后targetObj.name
的值为'JANE'
。
- 含义:它是要设置给属性的新值。在
receiver
参数(可选)- 含义:它通常是操作发生的对象。在大多数简单的情况下,它和
proxy
对象本身(即被用来设置属性的代理对象)是相同的。不过,在一些复杂的继承或者代理链场景下,它可以帮助确定真正接收操作的对象。这个参数提供了一种机制来正确地处理属性访问的上下文。 - 示例:
在这个例子中,当通过
let targetObj = { name: "John" }; let handler = { set(target, property, value, receiver) { console.log(`接收者是${receiver}`); target[property] = value; return true; }, }; let proxyObj = new Proxy(targetObj, handler); let anotherObj = Object.create(proxyObj); anotherObj.age = 30;
anotherObj
(它继承自proxyObj
)来设置属性age
时,receiver
参数将指向anotherObj
,这可以帮助拦截器更好地理解操作的上下文。
- 含义:它通常是操作发生的对象。在大多数简单的情况下,它和