Javascript 强制执行不'的不变性或部分不变性;不要默默地失败

Javascript 强制执行不'的不变性或部分不变性;不要默默地失败,javascript,ecmascript-6,immutability,Javascript,Ecmascript 6,Immutability,有没有办法对一个对象强制执行部分不变性,如果有人试图对其进行变异,该对象将抛出错误 例如,让obj={a:1,b:2}我希望obj.a和obj.b是不可变的,但仍然允许向obj添加更多的键,即允许obj.c=3 我想到在子对象中嵌套属性并使用Object.freeze如下: let obj = {subObj:{a: 1, b:2}}; Object.freeze(obj.subObj); 但之后它似乎会无声地失败,即obj.subObj.a=3不会变异a,但也不会给出任何问题的迹象。有没有

有没有办法对一个对象强制执行部分不变性,如果有人试图对其进行变异,该对象将抛出错误

例如,
让obj={a:1,b:2}
我希望
obj.a
obj.b
是不可变的,但仍然允许向obj添加更多的键,即允许
obj.c=3

我想到在子对象中嵌套属性并使用
Object.freeze
如下:

let obj = {subObj:{a: 1, b:2}}; 
Object.freeze(obj.subObj);
但之后它似乎会无声地失败,即
obj.subObj.a=3
不会变异
a
,但也不会给出任何问题的迹象。有没有办法强迫它抛出错误?

您可以尝试使用

在文件开头添加以下内容:

'use strict'

如果您在冻结后修改对象,它将引发异常。

执行此操作的简单方法是使用返回静态值和 犯错误的二传手

让obj={
得到一个(){
返回1;
},
设定值(val){
抛出新错误(“无法设置错误”);
},
得到b(){
返回2;
},
集合b(val){
抛出新错误(“无法设置b”);
}
};
对象c=3;//作品
控制台日志(obj);

对象a=4;//抛出错误
您可以使用
对象。defineProperties()
并将
可写
属性设置为
false
,用于属性
“a”
“b”
“使用严格的”
尝试..捕获..最后

“严格使用”;
设obj=新对象;
对象定义属性(obj{
“a”:{值:1,可写:false},
“b”:{值:2,可写:false}
});
试一试{
对象c=3;
目标a=3;
}捕获(e){
控制台日志(e);
}最后{
控制台日志(obj);

}
这是js反射吗?你说的“js反射”是什么意思?我的意思是反射,去掉“js”。