强制不可变性或部分不可变性,但不要默默失败。

4
有没有办法在对象上强制执行部分不可变性,如果有人试图改变它,就会抛出一个错误?
例如,让 let obj = {a: 1, b: 2},我希望 obj.aobj.b 不可变,但仍允许向 obj 添加更多键,即允许 obj.c = 3
我考虑将属性嵌套在子对象中,并像这样使用 Object.freeze:
let obj = {subObj:{a: 1, b:2}}; 
Object.freeze(obj.subObj);

但似乎它之后会默默失败,例如obj.subObj.a = 3不会改变a的值,但也没有任何提示问题的迹象。有没有办法强制它抛出错误?

3个回答

3

简单的方法是使用返回静态值的getter和抛出错误的setter。

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


3

您可以使用 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);
}


这是JavaScript反射吗? - shinzou
“js反射”是什么意思? - guest271314
我的意思只是反射,去掉“js”。 - shinzou

2
您可以尝试使用严格模式
请在文件开头添加以下内容:
'use strict'

如果在冻结后修改对象,它将抛出异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接