1、浅拷贝
浅拷贝只是拷贝基本类型的数据,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,因此存在父对象被篡改的可能,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
2、深拷贝
深拷贝就是能够实现真正意义上的数组和对象的拷贝。(深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象)
3、
a) 在传入父类传入的参数有引用元素时,则需要考虑深拷贝和浅拷贝的问题。
b) 浅拷贝:传参时值只传递了引用空间的地址
c) 深拷贝:开辟空间,且赋值
class Student{
constructor(newId,newName) {
this.id = newId;
this.name = newName;
}
//拷贝构造方法
clone(){
let s = new Student(this.id,this.name);
return s;
}
eat(){
console.log("eat()");
}
}
//浅拷贝:只是将对象的引用ID进行复制,但是并没有开辟空间
// let s1 = new Student("007","老王");
// let s2 = s1;
// s2.name = "大黄";
// console.log(s1.name);
//深拷贝
let s1 = new Student("007","老王");
let s2 = s1.clone();
s2.name = "大黄";
console.log(s1.name,s2.name);
继承中的深拷贝和浅拷贝
function Birthday(newY,newM,newD){
this.y = newY;
this.m = newM;
this.d = newD;
}
function Animal(newBir){
this.bir = newBir;
}
function Person(){
}
Person.prototype = new Animal(new Birthday(1,2,3));
//拷贝构造
Person.prototype.clone = function(){
let p = new Person();
p.bir = new Birthday(this.bir.y,this.bir.m,this.bir.d);
return p;
}
let p1 = new Person();
let p2 = p1.clone();
p2.bir.y = 666;
console.log(p1.bir.y);
console.log(p2.bir.y);