强制执行不会静默失败的不变性或部分不变性
Enforce immutability or partial immutability that doesn't fail silently
有没有办法对一个对象强制执行部分不变性,如果有人试图改变它就会抛出错误?
例如,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
但也没有给出任何问题的迹象。有没有办法强制它抛出错误?
您可以尝试使用 strict mode。
在文件开头添加以下内容:
'use strict'
冻结后修改对象会抛出异常
执行此操作的简单方法是使用 return 静态值和
抛出错误的设置器。
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);
}
有没有办法对一个对象强制执行部分不变性,如果有人试图改变它就会抛出错误?
例如,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
但也没有给出任何问题的迹象。有没有办法强制它抛出错误?
您可以尝试使用 strict mode。
在文件开头添加以下内容:
'use strict'
冻结后修改对象会抛出异常
执行此操作的简单方法是使用 return 静态值和 抛出错误的设置器。
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);
}