get

如果一属性是不可配置( configurable: false)&& 不可写( writable: false),那么Proxy不能修改改属性,否则通过Proxy对象访问该属性会报错

const target = Object.defineProperties({}, {
name: {
value: 'ming',
writable: false,
configurable: false
}
})
const hander = {
get(target,propKey) {
return 'abc'
}
}
const proxy = new Proxy(target,hander)
console.log(proxy.name)

报错:
Uncaught TypeError: ‘get’ on proxy: property ‘name’ is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected ‘ming’ but got ‘abc’)

翻译:属性​​name​​​是代理目标上的只读且不可配置的数据属性,但代理没有返回其实际值(预期为​​ming​​​,但得到了​​abc​​)

set

如果目标对象自身的某个属性不可写,那么set方法将不起作用

const obj = {};
Object.defineProperties(obj,{
name: {
value: 'f',
writable: false
}
})
const proxy = new Proxy(obj, {
set(target,propKey,value,receiver) {
obj[propKey] = 'kate'
return true
}
})
proxy.name = 'k'

报错:Uncaught TypeError: ‘set’ on proxy: trap returned truish for property ‘name’ which exists in the proxy target as a non-configurable and non-writable data property with a different value
翻译:
未捕获的TypeError: 'set’在代理上:trap为属性’name’返回truish,该属性存在于代理目标中,作为一个不可配置和不可写的数据属性,具有不同的值

注意,set代理应当返回一个布尔值。严格模式下,set代理如果没有返回true,就会报错。
经过自己实践,不是严格模式的话就不会报错

'use strict';
const handler = {
set: function(obj, prop, value, receiver) {
obj[prop] = receiver;
// 无论有没有下面这一行,都会报错
return false;
}
};
const proxy = new Proxy({}, handler);
proxy.foo = 'bar';
// TypeError: 'set' on proxy: trap returned falsish for property 'foo'
// Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'name'
// 未捕获的TypeError: 'set'上的代理:陷阱返回假的属性'name'

上面代码中,严格模式下,set代理返回false或者undefined,都会报错。