【发布时间】:2018-04-10 19:52:00
【问题描述】:
我在地图对象上创建了一个简单的代理示例。我无法弄清楚为什么 Set 处理程序没有被执行,而是执行 Get,对于 Sets。
const handler = {
get: (targetObj, propName, receiverProxy) => {
console.log('PROXY: From get.')
let ret = Reflect.get(targetObj, propName, receiverProxy)
if (typeof ret === 'function') {
ret = ret.bind(targetObj)
}
return ret
},
set: (targetObj, propName, propValue, receiverProxy) => {
console.log('PROXY: From set.')
return Reflect.set(targetObj, propName, propValue, receiverProxy)
},
}
const targetMap = new Map([
['iron', 'man'],
])
const targetObj = {}
const proxy = new Proxy(targetMap, handler)
console.log(proxy.set('super', 'man'))
console.log(proxy.get('super'))
【问题讨论】:
-
它会执行您的
get(),因为代理将参与访问目标对象(Map 实例)的“set”属性。处理程序的set()和get()方法是关于属性访问和更新的;它们与 Map 原型上的方法无关。如果您尝试proxy.x = 1;或其他方式,您会看到您的set()被调用。 -
您在哪里找到该代码?它看起来像是从答案到副本的精确副本:-)
-
我相信它来自那个帖子。问题是,该答案中的代码似乎有效,而我的却没有,即使我的几乎相同。
-
@Kainan 该答案的第一段解释了为什么它不起作用。并且第一个 sn-p 中的代码没有声称可以工作,它只拦截 property accesses 而没有别的。如何拦截
.set()和.get()调用,请看答案第二部分。
标签: javascript