从字面理解,freeze是冷冻,冻结的意思(像账户冻结)。
当用const申明常量时,基础数据类型申明后是不可以被修改的,但是申明数组和对象时,申明的变量只是指向了该引用数据类型的地址,所以只是地址不允许被修改,但是内容可以被修改,这个时候就可以用到Object.freeze()函数了
给用Object.freeze()函数包裹的对象添加属性时,打印出来的结果是没有添加成功的,那么对已有的属性进行修改,能否实现呢
![](https://pics0.baidu.com/feed/f703738da977391270bc10ebdffef81e347ae294.png?token=d341d5cde29f748583cb90c76d30fffd)
![](https://pics6.baidu.com/feed/9213b07eca8065381c512593b13adf42af3482e0.png?token=71b4cb5a6c03d6838a4ff3d45de5825a)
打印出来结果,并没有修改成功,这也就是Object.freeze()函数的作用,可以冻结数据,内容不允许被拓展和修改。
那么在Object.freeze()函数之前,是怎么实现引用数据类型的冻结功能的呢,根据Object.freeze()的这两个功能,我们可以手动封装一个Object.freeze()
可以看到用Object.defineProperty()函数对对象的属性添加了只读的描述后,该属性也是不允许被修改的,但是obj还是可以添加属性的,那么我们在用Object.seal()函数将obj包裹一下,就可以实现不允许添加属性的功能了
![](https://img2020.cnblogs.com/blog/2169261/202010/2169261-20201027144839863-684584081.png)
![](https://pics1.baidu.com/feed/b17eca8065380cd7922557ce89a3d332588281c3.png?token=529a475c0e5b6ef69afebcabd70cef36)
也就是说,我们可以把引用数据类型同时用Object.defineProperty()和Object.seal()函数封装包裹起来,就可以实现Object.freeze()函数的效果了
![](https://img2020.cnblogs.com/blog/2169261/202010/2169261-20201027144849678-558443966.png)
效果也是一样的,这就是Object.freeze()函数所实现的功能了。