一纺非、概念
深度克隆:深度克隆的新對(duì)象可以完全脫離原對(duì)象坏怪,我們對(duì)新對(duì)象的修改不會(huì)反映到原對(duì)象中
二、知識(shí)點(diǎn)儲(chǔ)備:
1. 函數(shù)的克隆直接通過(guò)普通賦值的方式奠伪,就實(shí)現(xiàn)了函數(shù)的克隆,并且不會(huì)影響之前的對(duì)象首懈。原因就是函數(shù)的克隆會(huì)在內(nèi)存單獨(dú)開(kāi)辟一塊空間绊率,互不影響。
var Person = function(){
this.name = "dai"
this.friends = ["A","B"]
}
var n = Person
n = function (){
console.log("message");
}
console.log(n)
/*function (){
console.log("message");
}*/
console.log(Person)
/*function(){
this.name = "dai"
this.friends = ["A","B"]
}
*/
2.安全的類(lèi)型檢測(cè):Object.prototype.toString.call(value) [Object NativeConstructor]
(字符串類(lèi)型的值)
console.log(Object.prototype.toString.call('dai') );// [object String]
console.log( Object.prototype.toString.call(123) );// [object Number]
console.log( Object.prototype.toString.call({name:"lu"}) );//[object Object]
console.log( Object.prototype.toString.call([1,2]) );// [object Array]
3. 需求:只克隆對(duì)象究履、數(shù)組滤否、函數(shù)、原始類(lèi)型值的屬性最仑,原型鏈上繼承過(guò)來(lái)的屬性也克隆過(guò)來(lái)
4.實(shí)現(xiàn)深度拷貝的思路:
- 先判斷傳入值得類(lèi)型藐俺,如果是對(duì)象則讓最終的返回值是對(duì)象類(lèi)型,同理數(shù)組泥彤,其他類(lèi)型的值直接返回就Ok
- 在傳入類(lèi)型是對(duì)象或者數(shù)組的情況下欲芹,遍歷傳入對(duì)象的key,如果key對(duì)應(yīng)的value還是對(duì)象或者數(shù)組,則遞歸函數(shù)本身(深層遍歷)吟吝,如果key對(duì)應(yīng)的value是除了對(duì)象和數(shù)組以外的值則把對(duì)應(yīng)的key和value都給函數(shù)最終要返回的結(jié)果
- 返回結(jié)果
三菱父、代碼實(shí)現(xiàn):
var isClass = function (o){
return Object.prototype.toString.call(o).slice(8,-1)
}
var deepClone = (function deepClone(obj){
var result,
oClass = isClass(obj);
if(oClass==='Object'){
result = {}
}else if(oClass==='Array'){
result = []
}else{
return obj
}
if(oClass==='Object'){
for(var key in obj){
result[key] = deepClone(obj[key])
}
}else if(oClass==="Array"){
for(var i=0;i<obj.length;i++){
result.push(deepClone(obj[i]))
}
}
return result
})
var orgin = {
name:{
firstName:"dai",
lastName:"lu"
},
firends:[{name:"A"},{name:"B"}],
age:26
}
var clone = deepClone(orgin);
console.log(clone);
clone.firends.push({name:"C"})
console.log(orgin.firends);
當(dāng)然:如果不想克隆原型鏈上繼承過(guò)來(lái)的屬性,只要在for in
循環(huán)里使用obj.getOwnProperty()
做一下判斷就可以過(guò)濾掉原型鏈上繼承過(guò)來(lái)的屬性了
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者