聽到這個名字的時候都被嚇尿了??寺÷犉饋砭秃軐诺臉幼?。不過其實琢磨了一下根本沒有什么好尿的——我特別討厭一些人故作高深的擺出一副科學家的鳥樣。
知乎上有一句話是這樣的:
什么叫做理解了某一個概念?就是你可以用簡單的語言把這個概念對你六歲的小侄女講明白。
深度克隆就是:把一個對象里面的東西一模一樣地復制到另一個對象,并且這兩個對象分別放在內(nèi)存的不同地方。
想象一個場景:我們希望給每一個注冊用戶建立一個數(shù)據(jù)模型,在此之前,我們要把這個用戶的數(shù)據(jù)模型模板給創(chuàng)建出來:

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

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

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

結(jié)果傻逼了,數(shù)組屬性出現(xiàn)了問題,3個對象的數(shù)組屬性都一樣。
這很好理解,因為簡單的復制對象,如果對象其中一個屬性是引用型變量,就會出現(xiàn)這種情況,因為引用型變量保存的是內(nèi)存地址,所以其實后來操作的都是同一塊內(nèi)存,導致了數(shù)組內(nèi)容都一樣。
對,剛才上面的那一套就是淺克隆,深克隆是什么?深克隆就是在克隆的時候判斷一下屬性的類型是不是引用型變量,如果是的話就用遞歸方法讓它一層一層進去復制自己。
遞歸的深度克隆代碼我貼到這里,因為沒什么技術(shù)含量,所以沒必要記錄思路,只要代碼就可以了。

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

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

這就是深度克隆了,其實是JS的繼承的方法的一種。
九點了,準備看會兒別的代碼收工回家了。