js的淺克隆和深度克隆

聽到這個名字的時候都被嚇尿了??寺÷犉饋砭秃軐诺臉幼?。不過其實琢磨了一下根本沒有什么好尿的——我特別討厭一些人故作高深的擺出一副科學家的鳥樣。

知乎上有一句話是這樣的:

什么叫做理解了某一個概念?就是你可以用簡單的語言把這個概念對你六歲的小侄女講明白。

深度克隆就是:把一個對象里面的東西一模一樣地復制到另一個對象,并且這兩個對象分別放在內(nèi)存的不同地方。

想象一個場景:我們希望給每一個注冊用戶建立一個數(shù)據(jù)模型,在此之前,我們要把這個用戶的數(shù)據(jù)模型模板給創(chuàng)建出來:


用戶模板

以后每個注冊用戶都會根據(jù)這個模板來生成對象??梢哉f這個userTemplate就是父對象了。

現(xiàn)在來了一個新用戶來注冊,這個用戶就是我非常喜歡的人民藝術(shù)家郭德綱。哈哈。我用這個模板對象復制一個新對象來,就像剛才說的,我寫一個函數(shù),把userTemplate對象的每一個屬性都復制到這個新對象里,代碼是這樣的:

給標簽屬性增加一個標簽,光頭


然后我們又來了一位用戶,是位美女,于是我們用剛才寫的函數(shù)新復制一個對象:

給蒼井空加一個辣妹的標簽

下面我在把模型插入數(shù)據(jù)庫之前,我要打印出來三個對象看看內(nèi)容是不是正確,打印的結(jié)果是這樣的:


三個對象的數(shù)組屬性是有問題的。

結(jié)果傻逼了,數(shù)組屬性出現(xiàn)了問題,3個對象的數(shù)組屬性都一樣。

這很好理解,因為簡單的復制對象,如果對象其中一個屬性是引用型變量,就會出現(xiàn)這種情況,因為引用型變量保存的是內(nèi)存地址,所以其實后來操作的都是同一塊內(nèi)存,導致了數(shù)組內(nèi)容都一樣。

對,剛才上面的那一套就是淺克隆,深克隆是什么?深克隆就是在克隆的時候判斷一下屬性的類型是不是引用型變量,如果是的話就用遞歸方法讓它一層一層進去復制自己。

遞歸的深度克隆代碼我貼到這里,因為沒什么技術(shù)含量,所以沒必要記錄思路,只要代碼就可以了。


遞歸深度克隆代碼

然后用這個新寫的函數(shù)去復制對象,重新讓郭德綱和蒼井空兩位老師注冊一下。


用深度克隆的方法來克隆對象。

這樣的話再打印出來看看:


一切正常了。

這就是深度克隆了,其實是JS的繼承的方法的一種。

九點了,準備看會兒別的代碼收工回家了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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