• 非构造函数的继承和拷贝


    、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;
        }
    }

     

  • 相关阅读:
    java 线程开启 中断
    手写迷你版hashmap
    基于状态机的乐观锁
    Python清空指定文件夹下所有文件的方法
    Python
    python+selenium配置Edge浏览器
    python+selenium怎么获取ul下面最后一个li或ul中有多少个li
    Python Selenium 笔记
    XPath定位时,使用文本的方法小技巧。
    python yield返回多个值
  • 原文地址:https://www.cnblogs.com/shen076/p/6558835.html
Copyright © 2020-2023  润新知