对象的描述属性对proxy的影响,defineProperties对proxy影响
原创
©著作权归作者所有:来自51CTO博客作者wx6375cd1abf2fb的原创作品,请联系作者获取转载授权,否则将追究法律责任
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,都会报错。