美文网首页
浅谈js中的继承和拷贝(下)

浅谈js中的继承和拷贝(下)

作者: WEB_Jorie | 来源:发表于2018-07-06 13:24 被阅读0次

    ----欢迎查看我的博客----

    拷贝

      在 上一节 中我们将了js继承的几种方式。这一节我们来讲一下,js对象的拷贝。为什么会出现拷贝。我们来看一个列子,您大致就明白了。

    var a = {b:1}
    var b = a
    a.b =2
    console.info(b.b) //2
    

      我们可以看到,两个对象是同一个内存地址,我们改变了a.b然而我们的b.b被动的改变了。所以这时候出现了一个东西叫对象的拷贝。此时我们又要引出两个概念:浅拷贝,深拷贝

    浅拷贝

      顾名思义,浅拷贝是说只是拷贝表层,并不会深入的拷贝对象。换句话说一个对象,它只会拷贝一层,而不会拷贝对象中的子对象。让我们看下几种浅拷贝的实现方式。

    对象

      对象的拷贝

    遍历实现浅拷贝

    var obj1 ={
        a:1
    }
    var obj2 = {
        b:2
    };
    
    function extendCopy(p,s) {
        var c = {};
        for (var i in p) { 
            c[i] = p[i];
        }
        for (var j in s) { 
            c[j] = s[j];
        }
        return c;
    }
    
    var newObj = extendCopy(obj1,obj2);
    console.info(newObj); // {a: 1, b: 2}
    

    es6中Object.assign实现浅拷贝

    // 对象浅拷贝, 复制所有可枚举属性
    const obj1 = {a: 1};
    const obj2 = {b: 2};
    // copy obj1 and obj2 to a new obj;
    const newObj = Object.assign({}, obj1, obj2)
    console.log(newObj) //// {a: 1, b: 2}
    

    es6中结构赋值实现浅拷贝

    const obj1 = {a: 1, b: 2};
    // obj2 equal obj1
    const obj2 = {...obj1};
    console.log(obj2) // {a: 1, b: 2}
    

    数组

      数组的拷贝。

    遍历拷贝。

    const arr = [1,2,3];
    let newarr = [];
    arr.map((data)=>{
        newarr.push(data)
    });
    console.log(newarr); //[1,2,3]
    

    Array.from(要复制的数组);

    const arr=[1,2,3];
    const newarr =Array.from(arr);
    console.info(newarr); //[1,23]
    

    ...结构赋值

    const arr=[1,2,3];
    const newarr=[...arr];
    console.info(newarr); //[1,2,3]
    

    深拷贝

      好了我们大概已经知道几种浅拷贝的方式和方法。下面我们来介绍下复杂的数据怎么办,很简单深拷贝。目前深拷贝有很多实现方式,比如lodash啊,jq啊,还有原生的js,我们这里大概枚举一些常用的。

    Underscore库 _.clone()

    var x = {
        a: 1,
        b: { z: 0 }
    };
    var y = _.clone(x);
    

    jQuery —— $.extend()

    var x = {
        a: 1,
        b: { f: { g: 1 } },
        c: [ 1, 2, 3 ]
    };
    
    var y = $.extend({}, x),          //shallow copy
        z = $.extend(true, {}, x);    //deep copy
    
    

    lodash _.cloneDeep(value)

    var objA = { "name": "colin" };
    var objB = _.cloneDeep(objA);
    

    原生js字符串

    var obj = {"a":1,"b":2}
    var newObj = JSON.parse((JSON.stringify(obj)))
    

    自己来封装一个diy

    var cloneObj = function(obj){
        var str, newobj = obj.constructor === Array ? [] : {};
        if(typeof obj !== 'object'){
            return;
        } else if(window.JSON){
            newobj = JSON.parse(JSON.stringify(obj));
        } else {
            for(var i in obj){
                newobj[i] = typeof obj[i] === 'object' ? 
                cloneObj(obj[i]) : obj[i]; 
            }
        }
        return newobj;
    };
    

    结语

      好了,今天的拷贝内容终于完结了,记录代码记录知识,本博客就是快准狠,直接上代码片段,希望喜欢的朋友给点支持多多转发,不说了,抽烟去了。

    相关文章

      网友评论

          本文标题:浅谈js中的继承和拷贝(下)

          本文链接:https://www.haomeiwen.com/subject/ziwvuftx.html