有没有办法用Javascript创建一个对象,其中对象上的每个属性只能写一次,而且在第一次写入后不可修改?
我所能做的只是一个代理对象,它具有赋值挂钩,〜像这样的东西:
var p = new Proxy({}, {
set: function(target, property, value, receiver){
Object.defineProperty(target, property, {
value: value,
writable: false
})
}
});
但代理使用起来很昂贵,并且在我需要支持的所有JS引擎中都不可用。有没有使用代理服务器来实现这个目标?
这适用于图书馆。我希望代表用户做不变性工作,并通过使用不变性来防止用户陷入某些陷阱。
我想创建一个不可变对象,但我希望该对象是可扩展的。但是,对象的任何扩展,我想成为一个不可变的属性。
注意: Object.freeze()不允许对象在事实之后可扩展,这对我的用例不起作用。
以下是一个例子:
let foo = {bar: 3};
foo.bar = 2; // should fail
foo.x = 1; // ok
foo.x = 2; // should fail
foo.y = {}; // ok
foo.y.z = 5; // ok
foo.y.z = 3; // should fail