• Object.freeze()冻结一个对象有什么意义?


    Object.freeze()方法可以冻结一个对象

    一个被冻结的对象再也不能被修改

    • 不能添加新属性
    • 不能删除已有属性
    • 不能修改已有属性的可枚举性、可配置性、可写性
    • 不能修改已有属性的值
    • 不能修改原型

    Object.freeze()的意义在哪里?

    应该就是跟const常量一样,只不过,const声明简单类型的值不能修改,对象却是可以修改的,所以,如果你想禁止一个对象的修改就可以用Object.freeze()

    const obj = {
      one: 1
    }
    obj.one = 2;
    console.log(obj.one);
    
    const obj2 = Object.freeze({
      one: 1
    })
    
    obj2.one = 2; // 无法修改,报错

    还有一种情况,就是如果这个one是一个对象呢,one依旧可以被修改。

    这叫浅冻结

    再看一个例子:

    const obj1 = {
      internal: {}
    }
    
    Object.freeze(obj1);
    obj1.internal.a = 'aValue'
    console.log(obj1.internal.a); // aValue

    对于一个常量对象,整个引用图(直接和间接引用其他对象)只能引用不可变的冻结对象。

    冻结的对象被认为是不可变的,因为整个对象中的整个对象状态(对其他对象的值和引用)是固定的。

    注意,字符串、数字和布尔总是不可变的,而函数和数组是对象。

    要使对象不可变,需要递归冻结每个类型为对象的属性(深冻结)。

    function deepFreeze(obj) {
      // 获取定义在obj上的属性名
      var propNames = Object.getOwnPropertyNames(obj);
      // 在冻结自身之前冻结属性
      propNames.forEach(function(name) {
        var prop = obj[name];
    
        // 如果prop是个对象,冻结它
        if (typeof prop == 'object' && prop !== null)
          deepFreeze(prop);
      });
      return Object.freeze(obj);
    }

    参考:https://www.mulingyuer.com/archives/362/

  • 相关阅读:
    mysql BETWEEN操作符 语法
    mysql IN操作符 语法
    mysql LIKE通配符 语法
    mysql TOP语句 语法
    mysql DELETE语句 语法
    mysql Update语句 语法
    mysql INSERT语句 语法
    mysql ORDER BY语句 语法
    mysql OR运算符 语法
    mysql AND运算符 语法
  • 原文地址:https://www.cnblogs.com/cathy1024/p/13711706.html
Copyright © 2020-2023  润新知