JS实现对象深度冻结

  1. 使用 const 定义一个对象
const api = {
        url: '127.0.0.1',
        post: 9090,
        obj: {
            arr: ['1', '2', '3']
        }
    }
  1. 执行一下以下代码
	 api.post = 8080
     console.log(api,"api"); // 结果为 {url: '127.0.0.1', post: 8080} 'api'
    /**
    * 由此可见,由 const 定义的引用类型函数 是可以改变的,那么怎么解决这个问题呢,接下来用到了对象冻结
    */
  1. 使用 Object.freeze 进行冻结
	Object.freeze(api);
    api.post = 8080
    api.obj.arr = []
    console.log(api,"api"); //打印结果为 {url: '127.0.0.1', post: 9090, obj: {arr:[]}} 'api'
   // post 没有被更改但是obj中的arr还是被更改了,说明freeze只能冻结一层,所以这里就需要写一个函数来进行操作
  1. 编写方法解决问题
	function objFreeze(obj) {
        // 判断是否为已经被冻结的对象,如果是则直接返回该对象
        if (Object.isFrozen(obj)) {
            return obj;
        }
        // 遍历获取到的对象key,判断是否为 object 类型 如果是则递归执行此函数
        Object.keys(obj).forEach(item => {
            typeof obj[item] === "object" ? objFreeze(obj[item]) : obj[item];
        })
        return Object.freeze(obj);
    }

    objFreeze(api);
    api.post = 8080
    api.obj.arr = []
    console.log(api, "api"); // 结果全都未被修改 ,说明函数编写成功 {url: '127.0.0.1', post: 9090, obj: { arr: (3) ['1', '2', '3']}} 'api'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值