关键词:proxy set 拦截器
-
target
参数- 本质和用途
target
是被代理的原始对象。它代表了代理操作所基于的实际对象。在Proxy
的set
拦截器中,target
的主要作用是提供对原始对象属性和状态的访问,以便在拦截属性设置操作时,可以正确地将新值应用到原始对象的相应属性上。
- 示例说明
- 假设我们有一个简单的对象
originalObject = { value: 10 };
,并创建了一个代理const proxy = new Proxy(originalObject, { set });
。当拦截器set
被触发时,target
就是originalObject
。例如:
const originalObject = { value: 10 }; const handler = { set(target, property, value) { console.log(`原始对象是: ${JSON.stringify(target)}`); target[property] = value; return true; }, }; const proxy = new Proxy(originalObject, handler); proxy.value = 20;
- 在这个例子中,当设置
proxy.value
时,target
就是originalObject
,set
拦截器可以通过target
来修改originalObject
的value
属性。
- 假设我们有一个简单的对象
- 本质和用途
-
receiver
参数- 本质和用途
receiver
是实际接收属性设置操作的对象。在简单的情况下,它通常就是代理对象本身。但是,在一些更复杂的场景中,比如涉及到对象的继承或者多层代理时,receiver
和target
可能不同,它能帮助确定操作发生的真实上下文。
- 示例说明
- 考虑这样一个场景,有一个基础对象
baseObject
,创建了一个代理proxy1
,然后又有一个对象通过Object.create(proxy1)
创建并继承自proxy1
。当在这个继承对象上进行属性设置操作时,receiver
将指向这个继承对象,而target
仍然是原始被代理的对象。
const baseObject = { count: 0 }; const handler = { set(target, property, value, receiver) { console.log(`接收操作的对象是: ${JSON.stringify(receiver)}`); console.log(`原始对象是: ${JSON.stringify(target)}`); target[property] = value; return true; }, }; const proxy1 = new Proxy(baseObject, handler); const derivedObject = Object.create(proxy1); derivedObject.count = 1;
- 在这个例子中,当设置
derivedObject.count
时,receiver
是derivedObject
,因为它是实际接收操作的对象,而target
是baseObject
,因为它是原始被代理的对象。这就体现了receiver
和target
在复杂场景下的区别。
- 考虑这样一个场景,有一个基础对象
- 本质和用途