强制执行不会静默失败的不变性或部分不变性

Enforce immutability or partial immutability that doesn't fail silently

有没有办法对一个对象强制执行部分不变性,如果有人试图改变它就会抛出错误?

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

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