一個對象 foo 有一個屬性 baidu
var foo = {
baidu:'woshibaidu'
}
現(xiàn)在有一個對象 boo 引用了foo
var boo = foo
所以此時,在boo里添加屬性,或者修改屬性,都會影響到foo,例如:此代碼會在foo和boo里同時增加一個屬性。
boo.google = "imgoogle"
現(xiàn)在有問題來了。boo增加的google屬性,會在foo出現(xiàn),并且在boo修改時,foo內(nèi)也會改變,如何做到boo引用foo內(nèi)百度的值,但在foo內(nèi)無法修改boo內(nèi)google的值呢
你直接這樣做的相當(dāng)于是對一個對象的做淺拷貝
。對于一個對象來說,你這樣賦值是把boo指向了foo的堆里面(相可以想成:foo和boo指向同一個地址),所以你不論是改變foo還是boo都是改變的同一個東西。。。所以說如果你是只是要里面的值,你應(yīng)該用深拷貝
的方式:
`
var foo = {
baidu:'woshibaidu'
}
var boo = JSON.parse(JSON.stringify(foo));
boo.baidu = "newBaidu"
boo.google = "imgoogle";
console.log(foo) // {baidu: "woshibaidu"}
console.log(boo) // {baidu: "newBaidu", google: "imgoogle"}
`
這樣的方法便可以實現(xiàn)對象的深拷貝,但是有一個問題就是,如果你的對象里面有函數(shù)調(diào)用,就會跳過那個顯示。所以如果有那種情況只能用遞歸來實現(xiàn)一個對象的深拷貝
如果你是想直接克隆一個對象,完全獨立,如下:
function objClone(initalObj){
var o = initalObj instanceof Array ? [] : {};
for(var k in initalObj) {
o[k] = (typeof(initalObj[k]) === 'object')&&(initalObj[k] != null) ? objClone(initalObj[k]) : initalObj[k];
}
return o;
}
var foo = {
baidu:'woshibaidu'
};
var boo = objClone(foo);
boo.google = "imgoogle"; // foo.google為undefined
//foo與boo完全隔離,任何操作都不會有相互影響
如果你是想繼承一個對象,然后再做修改,如下
function deepPrototypeClone(obj) {
const ret = Object.create(obj);
for (const [key, value] of Object.entries(obj)) {
if (value && typeof value === 'object') {
ret[key] = deepPrototypeClone(value);
}
}
return ret;
}
var foo = {
baidu:'woshibaidu'
};
var boo = deepPrototypeClone(foo);
boo.google = "imgoogle"; // foo.google為undefinded
//boo不會影響foo,但foo會影響boo(如果foo的某個屬性沒被boo重新賦值過)
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。