非构造函数的继承和拷贝

、object()方法(不够完善)

只能用于对象


  var Chinese = {
    nation:'中国'
  };
  var Doctor ={
    career:'医生'
  };
  function object(parent) { 
    function F() {}
    F.prototype = parent;
    return new F();
  }
    Doctor = object(Chinese);
    console.log(Doctor.nation); //中国

二、浅拷贝(不够完善)

对象的浅拷贝:


 var Chinese = {
    nation:'中国',
       birthPlaces:['北京','上海','香港']
  };
  var Doctor ={
    career:'医生'
  };
   function extendCopy(p) {
    var c = {};
    for (var i in p) { //子对象获得的只是一个内存地址,而不是内容
      c[i] = p[i];
    }
    //c.uber = p;
    return c;
  }
    Doctor = extendCopy(Chinese);
    console.log(Doctor.nation); //中国
    Doctor.birthPlaces.push('厦门');
    console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
    console.log(Chinese.birthPlaces); //北京, 上海, 香港, 厦门
    //父对象也被篡改了。第一点的object()方法也同样存在这个问题。也可以看成对象的浅拷贝。

数组的浅拷贝:


//1
var arr2 = arr1.slice();
//2
var arr2 = arr1.concat();

通用浅拷贝函数:


var simpleCopy = function(o){
    if (o instanceof Array) { //数组浅拷贝
        var n = [];
        for (var i = 0i < o.length; ++i) { //注意是++i,先加再执行
            n[i] = o[i];
        };
        return n;
    } else if (o instanceof Object) { //对象浅拷贝
        var n = {};
        for (var i in o) { //对象遍历要用for in
            n[i] = o[i];
        };
        return n;
    }
}

 注意直接用等号并不是浅拷贝,而是相等,修改任意一项都会有影响。

 

、深拷贝

对象的深拷贝:


 var Chinese = {
    nation:'中国',
       birthPlaces:['北京','上海','香港']
  };
  var Doctor ={
    career:'医生'
  };
   function deepCopy(pc) {
    var c = c || {}; //这里决定了返回的是对象
    for (var i in p) {
      if (typeof p[i] === 'object') {
        c[i] = (p[i].constructor === Array) ? [] : {};
        deepCopy(p[i], c[i]);
      } else {
         c[i] = p[i];
      }
    }
    return c;
  }
    Doctor = deepCopy(Chinese);
    console.log(Doctor.nation); //中国
    Doctor.birthPlaces.push('厦门');
    console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
    console.log(Chinese.birthPlaces); //北京, 上海, 香港

对象的深拷贝:(最简单)


var obj2 = JSON.parse(JSON.stringify(obj));

通用深拷贝函数:


var deepCopy = function(o) {
    if (o instanceof Array) { //一定要把Array判断放在Object判断上面
        var n = [];
        for (var i = 0i < o.length; ++i) { 
            n[i] = deepCopy(o[i]);
        };
        return n;

    } else if (o instanceof Object) {
        var n = {};
        for (var i in o) {
            n[i] = deepCopy(o[i]);
        };
        return n;
    } else { //返回o
        return o;
    }
}

 

转载于:https://www.cnblogs.com/shen076/p/6558835.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值