對(duì)象的深淺拷貝

淺拷貝只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身,新舊對(duì)象還是共享同一塊內(nèi)存。
但深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象

默認(rèn)淺拷貝

一、淺拷貝

拷貝了對(duì)象的存放地址,只是指向相同而已 (只解決了第一層,對(duì)象中還有對(duì)象就不適用了)

淺拷貝只是拷貝基本類型的數(shù)據(jù),如果父對(duì)象的屬性等于數(shù)組或另一個(gè)對(duì)象,那么實(shí)際上,子對(duì)象獲得的只是一個(gè)內(nèi)存地址,因此存在父對(duì)象被篡改的可能,淺拷貝只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身,新舊對(duì)象還是共享同一塊內(nèi)存

二、深拷貝

完全復(fù)制了一個(gè)獨(dú)立的個(gè)體

深拷貝就是能夠?qū)崿F(xiàn)真正意義上的數(shù)組和對(duì)象的拷貝。遞歸調(diào)用"淺拷貝"。(深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象)

三、ES5 繼承

第一種繼承 引用值類型,內(nèi)存地址相同,繼承原型
        son.prototype = Father.prototype;
第二種繼承 繼承原型 和 私有屬性
        Son.prototype = new Father({});
第三種繼承
        function middle() {}; // 中間商
        middle.prototype = Father.prototype; // 繼承原型
        Son.prototype = new middle(); // 過(guò)濾私有屬性
第四種繼承 for in 遍歷 只拷貝一層 不會(huì)遍歷原型鏈(淺拷貝)
        for (var key in Father.prototype) {
            Son.prototype[key] = Father.prototype[key];
        }
第五種 這種拷貝方法 不支持拷貝函數(shù)

把先對(duì)象轉(zhuǎn)化為字符串(值類型,字符串格式對(duì)象),再轉(zhuǎn)化為JSON 格式對(duì)象,

原理: 用 JSON.stringify 將對(duì)象轉(zhuǎn)成 JSON 字符串,再用JSON.parse() 把字符串解析成對(duì)象,一去一來(lái),新的對(duì)象產(chǎn)生了,而且對(duì)象會(huì)開辟新的棧,實(shí)現(xiàn)深拷貝。

這種方法雖然可以實(shí)現(xiàn)數(shù)組或?qū)ο笊羁截?,但不能處理函?shù)。

這是因?yàn)?JSON.stringify() 方法是將一個(gè)JavaScript 值(對(duì)象或者數(shù)組)轉(zhuǎn)換為一個(gè) JSON 字符串,不能接受函數(shù)。

        JSon.parse( JSON.stringfy(obj) )
image.png

四、ES6繼承

子類 extends 基類(父類)
constructor內(nèi)部必須調(diào)用 super()方法,繼承私有屬性,必須傳參
如果不調(diào)用,報(bào)語(yǔ)法錯(cuò)誤
constructor 之外默認(rèn)寫原型擴(kuò)展方法,默認(rèn)繼承父類原型方法

        class Person {
            constructor (data) {
                this.name = data.name;
                this.age = data.age;
            }

            add(){console.log(this.name);}
            sub(){console.log(this.age);}
        }

        class Son extends Person{
            constructor (data) {
                super(data),
                this.x = data.x
            }

            del(){
                console.log(this.name)
            }
        }

        const p1 = new Person({
            "name" : '帥逼',
            "age" : 18
        });

        const p2 = new Son({
            "name" : '大帥逼',
            "age" : 213456,
            "x" : 465
        });

        console.log(p1.name) // 帥逼
        console.log(p1.age) // 18
        console.log(p1.x) // undefined
        console.log(p2.name) // 大帥逼
        console.log(p2.age) // 213456
        console.log(p2.x) // 465

ES5 深淺拷貝

        var obj1 = {
            a : 1,
            b : [1, 2, 3, {
                a : 1,
                b : 2
            }],
            c : undefined,
            d : null
        };

        // obj 為要拷貝的對(duì)象 deep 為開啟深淺拷貝
        function copy(obj1, deep) {
            var obj2 = {}

            // 判斷對(duì)象是否是數(shù)組   Array.isArray(obj) 有兼容問(wèn)題,所以排除 
            if (obj1 instanceof Array) {
                obj2 = [];
            }

            /*
                判斷每一個(gè)值是否是引用值對(duì)象
                判斷當(dāng)前是 深拷貝 還是 淺拷貝
                淺拷貝直接賦值
                深拷貝繼續(xù)拷貝下去
                
            */ 
            for (var key in obj1) {
                var value = obj1[key]; // 取出每一個(gè)值
                obj2[key] = (!!deep && typeof value === 'object' && value !== null) ? copy(value, deep) : value;
            }

            return obj2;
        }
        const obj2 = copy(obj1,true) // 不傳遞deep參數(shù)的時(shí)候默認(rèn)就是淺拷貝
        obj2.b.push('x')
        console.log(obj1)
        console.log(obj2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 直到今天我才開始了解在我16歲生日時(shí),她送我那句話的含義,我也再一次感謝感情眷顧我。 我離開至親,遠(yuǎn)赴他鄉(xiāng)...
    Meet櫻子閱讀 162評(píng)論 0 1
  • 〇、前言 2016年過(guò)的很不好,拖延癥很嚴(yán)重,遇到問(wèn)題的時(shí)候總是逃避拖著不干,等到晚上的時(shí)候,又為一天的無(wú)所事事而...
    MiracleWong閱讀 400評(píng)論 1 1
  • 我們兩個(gè)月沒(méi)見(jiàn)面,我已經(jīng)不知道還能不能稱之為男女朋友,終于過(guò)年前一起吃了晚飯。 吃飯間你問(wèn)我怎么把微信名字改了,呵...
    漫漫的慢慢閱讀 1,363評(píng)論 5 13

友情鏈接更多精彩內(nèi)容