【问题标题】:Enforce immutability or partial immutability that doesn't fail silently强制执行不变性或部分不变性,不会静默失败
【发布时间】:2017-05-14 15:37:17
【问题描述】:

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

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

【问题讨论】:

    标签: javascript ecmascript-6 immutability


    【解决方案1】:

    执行此操作的简单方法是使用返回静态值的 getter 和 抛出错误的设置器。

    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

    【讨论】:

      【解决方案2】:

      对于属性"a""b""use strict"try..catch..finally,您可以使用Object.defineProperties() 并将writable 设置为false

      "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);
      }

      【讨论】:

      • 这是js反射吗?
      • “js反射”是什么意思?
      • 我的意思是反射,去掉“js”。
      【解决方案3】:

      您可以尝试使用strict mode

      在文件的开头添加以下内容:

      'use strict'
      

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

      【讨论】:

        猜你喜欢
        • 2019-06-21
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        • 2014-09-17
        相关资源
        最近更新 更多