zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    pku 2446 Chessboard
    POJ 2724 Purifying Machine
    14 Flash内存控制器(FMC)
    10 PWM发生器和捕捉定时器
    15 I2C总线控制器
    18 RTX Kernel实时系统
    17模拟数字转换
    19.1 详解startup_M051.s
    16串行外围设备接口(SPI)控制器
    13看门狗
  • 原文地址:https://www.cnblogs.com/cathy1024/p/13711706.html
Copyright © 2011-2022 走看看