const常量对象Object.freeze()冻结方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44198965/article/details/101213877

前言

我们知道,const 保证的 并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动,因此 const 只能保证这个指针是固定的(总是指向另一个固定的地址),至于指向的数据结构可不可变就束手无策了。

// 定义一个常量对象 => demo
const demo = {}

// 为其对象添加属性 => demo
demo.a = 1;
demo.b = '1';

// 尝试访问属性 => a
console.log(demo.a)//1(成功访问)

// 把一个新对象赋给 demo
var new_obj = {c:1,d:2}
demo = new_obj;//Assignment to constant variable.

定义一个常量对象 demo ,然后为其添加属性,由于对象本身是可变的所以成功添加并成功访问到属性 a ,但是当把 new_obj 赋给 demo 后,报错是因为把 demo 指向了另一个内存地址

Object.freeze({ })

首先,先来看一下 Object.freeze() 方法,该方法可以冻结一个对象,一个被冻结的对象再也不能被修改,冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。

// 常量对象 => demo
const demo = {
  a: 1,
  b: 2
}

// 冻结该对象
Object.freeze(demo)

// 尝试添加属性
demo.new = "new"

// 尝试访问
console.log(demo.new)//undefined(失败)
console.log(demo.a)//1(成功)

// 尝试指向其他对象
demo = ['1','2']//Assignment to constant variable.(失败)

可以看到, demo.new = “new” / demo = [ ‘1’ , ‘2’ ] 似乎没有生效,这也是我们预期中的结果。

注意:此时,对象的原型 prototype 也不能被修改,freeze() 返回和传入的参数相同的对象。

猜你喜欢

转载自blog.csdn.net/weixin_44198965/article/details/101213877