Object.freeze() 和 Object.seal()

首先定义一个对象:
1 | const obj = { |
虽然这里使用了 const 关键字,其实创建的只是一个对象引用,所以依旧是可以修改对象里面的值的,如果我们想让对象不可以修改,应该怎么办呢?
那就要用到 Object.freeze()了。它的作用是冻结一个对象,被冻结的对象再也不能被修改,不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
1 | const arr = [1, 2, 3] |
可以看到对象被“冻结”了,传入一个数组看看:
1 | const arr = [1, 2, 3] |
可以发现 freeze() 同样可以使数组冻结,这其实也很好理解,数组本质也是对象嘛。
1 | const obj = { |
这里我们可以发现一个问题,当对象里其他引用类型的时候,冻结效果失效了。。。这让我想到了浅拷贝,那是不是可以类似“深拷贝”一样,也来封装一个“深冻结”,尝试一下看看:
1 | const deepFreeze = object => { |
emm 果然不出所料,成功做到了“深冻结”。
原理:如果知道 Object.defineProperty(),通过下面的属性就可以做到冻结的效果
1 | const obj = {} |
有时候我们想保持原来的数据结构,又改变对象里面的值,怎么办呢?这就可以用 Object.seal()
1 | const obj = { |
可以看到能够修改属性,但是删除不了。
Object.freeze()和 Object.freeze()的区别就是前者允许修改属性,而后者则不可以。
- 本文标题:Object.freeze() 和 Object.seal()
- 创建时间:2020-03-02 12:03:05
- 本文链接:2020/03/02/Object.freeze() 和 Object.seal()/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
评论