对象深浅拷贝的四种方法

对象深浅拷贝的四种方法

存在这么一个对象,对他进行深拷贝

    var obj = {
      name: '法外狂徒张三',
      age: 24, 
      say() {
        console.log('鱼跃此时海');
      }
    };
浅拷贝 :仅仅是指针给了另一个对象
    var obj = {
      name: '法外狂徒张三',
      age: 24, 
      say() {
        console.log('鱼跃此时海');
      }
    };
    var obj1 = obj;
    obj1.name = '热心市民王先生';
    //此时,我们对obj1进行改变,查看obj、obj1
    console.log(obj)// { name: '热心市民王先生',age: 24, say(){console.log('鱼跃此时海')}}
    console.log(obj1)// { name: '热心市民王先生',age: 24, say(){console.log('鱼跃此时海')}}

我们可以发现,原来的obj的name也被改变了,这就是浅拷贝

深拷贝
1、通过json实现,会造成方法丢失
    var obj = {
      name: '法外狂徒张三',
      age: 24, 
      say() {
        console.log('鱼跃此时海');
      }
    };
    var obj1 = JSON.stringify(obj);
    obj1 = JSON.parse(obj1);
    obj1.name = '热心市民王先生'
    console.log(obj1);// { name: '热心市民王先生',age: 24}
    console.log(obj)// { name: '法外狂徒张三',age: 24, say(){console.log('鱼跃此时海')}}

我们可以发现,json方法,没有改变obj原对象,但是,方法没有被继承

2、通过for-in遍历循环,实现
    var obj = {
      name: '法外狂徒张三',
      age: 24, 
      say() {
        console.log('鱼跃此时海');
      }
    };
    var obj2 = {};
    for (var attr in obj) {
      obj2[attr] = obj[attr]
    }
    obj2.name = '热心市民王先生'
    console.log(obj2);// { name: '热心市民王先生',age: 24,say(){console.log('鱼跃此时海')}}
    console.log(obj)// { name: '法外狂徒张三',age: 24, say(){console.log('鱼跃此时海')}}

通过for-in遍历循环,新的obj2改变,obj原对象没有被改变,方法被继承

3、通过Object.assign()
    var obj = {
      name: '法外狂徒张三',
      age: 24, 
      say() {
        console.log('鱼跃此时海');
      }
    };
    var obj3 = {};
    Object.assign(obj1, obj);
    obj3.name = '热心市民王先生'
    console.log(obj3);// { name: '热心市民王先生',age: 24,say(){console.log('鱼跃此时海')}}
    console.log(obj)// { name: '法外狂徒张三',age: 24, say(){console.log('鱼跃此时海')}}

通过Object.assign(),新的obj3改变,obj原对象没有被改变,方法被继承

4、通过…语法继承
    var obj = {
      name: '法外狂徒张三',
      age: 24, 
      say() {
        console.log('鱼跃此时海');
      }
    };
    var obj4 = {};
    obj4={...obj}
    obj4.name = '热心市民王先生'
    console.log(obj4);// { name: '热心市民王先生',age: 24,say(){console.log('鱼跃此时海')}}
    console.log(obj)// { name: '法外狂徒张三',age: 24, say(){console.log('鱼跃此时海')}}

通过…语法,新的obj4改变,obj原对象没有被改变,方法被继承

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值