定义:
深拷贝(深复制):源对象与拷贝对象互相独立,其中任何一个对象的属性改动都不会对另外一个对象造成影响。
浅拷贝(浅复制):拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,其中任何一个对象的属性改动都会对另外一个对象造成影响。
注意:
此类判断需要忽略原型属性的引用,因为你不应该重新生成一个NewObject
且NewObject !== window.Object
。
问题点:
问:下面的方法实现的是深拷贝还是浅拷贝。
var source = new Cat();
var target = source.clone();
答:深拷贝和浅拷贝,要根据clone函数的具体实现是否符合定义来判断。
看以下实现
// ...
setAttribute(key,value){
// 属性设定
}
copy(source){
for(key in source){
this.setAttribute(key, source[key])
}
}
clone(){
return new constructor().copy(this)
}
// ...
假设1:该对象属于单例模式,即constructor
方法返回的对象永远指向同一块内容,则必然符合浅拷贝的定义。
假设2:该对象非单例模式,则必然不符合浅拷贝。
假设2.1:原对象的的所有属性都不是引用类型,则必然符合深拷贝
的定义。
假设2.2: 原型对象的属性,包含部分引用类型,则需要根据引用类型的指针来判断是否属于深拷贝。
假设2.2.1:所有引用类型的属性都采用了深拷贝
, 则符合深拷贝
定义。
假设2.2.2:有部分引用类型的属性采用了浅拷贝
,则不符合
深拷贝的定义。
总结
既不符合深拷贝
,又不符合浅拷贝
,则被称为部分深拷贝
。