Javascript ES6用于获取冻结对象的嵌套代理
我正在尝试深度代理冻结对象的属性:Javascript ES6用于获取冻结对象的嵌套代理,javascript,ecmascript-6,es6-proxy,Javascript,Ecmascript 6,Es6 Proxy,我正在尝试深度代理冻结对象的属性: const a = Object.freeze([{ prop: 1 }]) const proxy = new Proxy(a, { get(target, property) { return new Proxy(target[property], {}); } }) console.log(proxy[0]) 这会产生类型错误: TypeError: 'get' on proxy: property '0' is a
const a = Object.freeze([{ prop: 1 }])
const proxy = new Proxy(a, {
get(target, property) {
return new Proxy(target[property], {});
}
})
console.log(proxy[0])
这会产生类型错误:
TypeError: 'get' on proxy: property '0' is a read-only and non-configurable data property on the proxy target but the proxy did not return
我发现get
代理有以下限制:
如果目标对象属性是不可写、不可配置的自有数据属性,则为属性报告的值必须与相应目标对象属性的值相同。-
有没有办法在冻结的对象上嵌套代理 您应该注意的一点是Object.freeze是shallowAlso,这段代码在每个
get
调用上创建一个代理?这是故意的吗?或者您只是想将代理对象添加到嵌套对象中?该示例仅演示了该问题。实际代码记录get
,以避免为同一属性创建多个代理。您是否可以克隆a
对象并将其用作代理的目标?我要说的是,不要冻结对象,因为效果很浅。不要强制执行不变性,而是将其视为Javascript中的准则/策略。当您使用纯函数和组合器(如透镜和适当的数据结构(递归列表))时,几乎不会发生突变。顺便说一句,如果你心里有记录,Object.prototype.seal
是一个很好的折衷方案。