有没有办法在对象上强制实施部分不变性,如果有人试图改变它,它会抛出错误?
例如,let 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
变异,但也没有给出任何问题的迹象。有没有办法强制它抛出错误?
执行此操作的简单方法是使用返回静态值和抛出错误的二传手。
let obj = {
get a() {
return 1;
},
set a(val) {
throw new Error('Can't set a');
},
get b() {
return 2;
},
set b(val) {
throw new Error('Can't set b');
}
};
obj.c = 3; // works
console.log(obj);
obj.a = 4; // throws an error
Object.defineProperties()
将writable
设置为false
属性"a"
和"b"
、"use strict"
、try..catch..finally
"use strict";
let obj = new Object;
Object.defineProperties(obj, {
"a": {value:1, writable: false},
"b": {value:2, writable: false}
});
try {
obj.c = 3;
obj.a = 3;
} catch (e) {
console.log(e);
} finally {
console.log(obj);
}
您可以尝试使用严格模式。
在文件的开头添加以下内容:
'use strict'
如果您在冻结后修改对象,它将引发异常。