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
是一个很好的折衷方案。