强制实施不可变性或部分不变性,不会以静默方式失败



有没有办法在对象上强制实施部分不变性,如果有人试图改变它,它会抛出错误?

例如,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变异,但也没有给出任何问题的迹象。有没有办法强制它抛出错误?

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

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'

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