淺拷貝只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身,新舊對(duì)象還是共享同一塊內(nèi)存。
但深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象
默認(rèn)淺拷貝
一、淺拷貝
拷貝了對(duì)象的存放地址,只是指向相同而已 (只解決了第一層,對(duì)象中還有對(duì)象就不適用了)
淺拷貝只是拷貝基本類型的數(shù)據(jù),如果父對(duì)象的屬性等于數(shù)組或另一個(gè)對(duì)象,那么實(shí)際上,子對(duì)象獲得的只是一個(gè)內(nèi)存地址,因此存在父對(duì)象被篡改的可能,淺拷貝只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身,新舊對(duì)象還是共享同一塊內(nèi)存
二、深拷貝
完全復(fù)制了一個(gè)獨(dú)立的個(gè)體
深拷貝就是能夠?qū)崿F(xiàn)真正意義上的數(shù)組和對(duì)象的拷貝。遞歸調(diào)用"淺拷貝"。(深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象)
三、ES5 繼承
第一種繼承 引用值類型,內(nèi)存地址相同,繼承原型
son.prototype = Father.prototype;
第二種繼承 繼承原型 和 私有屬性
Son.prototype = new Father({});
第三種繼承
function middle() {}; // 中間商
middle.prototype = Father.prototype; // 繼承原型
Son.prototype = new middle(); // 過(guò)濾私有屬性
第四種繼承 for in 遍歷 只拷貝一層 不會(huì)遍歷原型鏈(淺拷貝)
for (var key in Father.prototype) {
Son.prototype[key] = Father.prototype[key];
}
第五種 這種拷貝方法 不支持拷貝函數(shù)
把先對(duì)象轉(zhuǎn)化為字符串(值類型,字符串格式對(duì)象),再轉(zhuǎn)化為
JSON格式對(duì)象,
原理: 用
JSON.stringify將對(duì)象轉(zhuǎn)成JSON字符串,再用JSON.parse()把字符串解析成對(duì)象,一去一來(lái),新的對(duì)象產(chǎn)生了,而且對(duì)象會(huì)開辟新的棧,實(shí)現(xiàn)深拷貝。
這種方法雖然可以實(shí)現(xiàn)數(shù)組或?qū)ο笊羁截?,但不能處理函?shù)。
這是因?yàn)?
JSON.stringify()方法是將一個(gè)JavaScript值(對(duì)象或者數(shù)組)轉(zhuǎn)換為一個(gè)JSON字符串,不能接受函數(shù)。
JSon.parse( JSON.stringfy(obj) )

四、ES6繼承
子類
extends基類(父類)
constructor內(nèi)部必須調(diào)用super()方法,繼承私有屬性,必須傳參
如果不調(diào)用,報(bào)語(yǔ)法錯(cuò)誤
constructor之外默認(rèn)寫原型擴(kuò)展方法,默認(rèn)繼承父類原型方法
class Person {
constructor (data) {
this.name = data.name;
this.age = data.age;
}
add(){console.log(this.name);}
sub(){console.log(this.age);}
}
class Son extends Person{
constructor (data) {
super(data),
this.x = data.x
}
del(){
console.log(this.name)
}
}
const p1 = new Person({
"name" : '帥逼',
"age" : 18
});
const p2 = new Son({
"name" : '大帥逼',
"age" : 213456,
"x" : 465
});
console.log(p1.name) // 帥逼
console.log(p1.age) // 18
console.log(p1.x) // undefined
console.log(p2.name) // 大帥逼
console.log(p2.age) // 213456
console.log(p2.x) // 465
ES5 深淺拷貝
var obj1 = {
a : 1,
b : [1, 2, 3, {
a : 1,
b : 2
}],
c : undefined,
d : null
};
// obj 為要拷貝的對(duì)象 deep 為開啟深淺拷貝
function copy(obj1, deep) {
var obj2 = {}
// 判斷對(duì)象是否是數(shù)組 Array.isArray(obj) 有兼容問(wèn)題,所以排除
if (obj1 instanceof Array) {
obj2 = [];
}
/*
判斷每一個(gè)值是否是引用值對(duì)象
判斷當(dāng)前是 深拷貝 還是 淺拷貝
淺拷貝直接賦值
深拷貝繼續(xù)拷貝下去
*/
for (var key in obj1) {
var value = obj1[key]; // 取出每一個(gè)值
obj2[key] = (!!deep && typeof value === 'object' && value !== null) ? copy(value, deep) : value;
}
return obj2;
}
const obj2 = copy(obj1,true) // 不傳遞deep參數(shù)的時(shí)候默認(rèn)就是淺拷貝
obj2.b.push('x')
console.log(obj1)
console.log(obj2)