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

标签 javascript ecmascript-6 immutability

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

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

最佳答案

做到这一点的简单方法是使用返回静态值的 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

关于javascript - 强制执行不会静默失败的不变性或部分不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43961192/

相关文章:

javascript - 通过 UglifyJS 枚举正则表达式

php - 如何防止php中的两个单独的ajax调用修改同一个数据库

javascript - 以父组件内对象的形式从所有子组件获取合并数据 : React JS

javascript - 创建后立即自动提交 ReactJS 表单

variables - Haskell 有变量吗?

python - Python 中的 String 是不可变的吗?

javascript - 一种在 NodeJS 中获取和发送 Instagram 直接消息的方法

javascript - 为什么不能在两个 dom 元素中附加同一个子元素?

javascript - 使用 ES6 箭头函数过滤 'objects with nested objects' 数组

Java Immutable Collection,也修复引用