在js中如何把一個對象里的屬性和方法復制給另一個對象呢?
下面舉一個例子來說明:
var person={name:'chen',age:18};
var son={sex:'男'};
function clone(p,s){
var s=s||{};//判斷s對象是否存在,不存在則定義s為空對象
for(var prop in p){
s[prop]=p[prop];
};
return s;//返回s對象
};
clone(person,son);
調用clone函數最終返回的結果為 {sex: "男", name: "chen", age: 18}.
但是假如 var person={name:'chen',age:18,man:{hight:188}};即person 對象里包含一個子對象man;
那么在復制時淺拷貝只是將子對象的一個引用地址復制給son對象;son和person里的man 屬性都指向同一個對象,故改變任一個都能影響到另外一個:例子如下:
var person={name:'chen',age:18,man:{hight:188}}
var son={sex:'男'};
function clone(p,s){
var s=s||{};//判斷s對象是否存在,不存在則定義s為空對象
for(var prop in p){
s[prop]=p[prop];
};
return s;//返回s對象
};
clone(person,son);
son.name='ze';
console.log(son.name);//打印ze
console.log(person.name);//打印chen
son.man.hight=1999;
console.log(son.man.hight);//打印1999
console.log(person.man.hight);//打印1999
深拷貝可以很好的解決引用類型的拷貝問題
采用遞歸的方法去復制拷貝對象,從而解決淺拷貝帶來的弊端
var person={name:'chen',age:18,man:{hight:188}}
var son={sex:'男'};
function clone(p,s){
var s=s||{};//判斷s對象是否存在,不存在則定義s為空對象
for(var prop in p){
if(typeof p[prop]=='object'){
s[prop]=(p[prop].constructor===Array)?[]:{};//三元運算,將s[prop]初始化為數組或者對象
clone(p[prop],s[prop])
}
else{
s[prop]=p[prop];
}
};
return s;//返回s對象
};
clone(person,son);
son.name='ze';
console.log(son.name);//打印ze
console.log(person.name);//打印chen
son.man.hight=1999;
console.log(son.man.hight);//打印1999
console.log(person.man.hight);//打印188
以上內容就是我個人的一些理解,希望能給你帶來收獲!有需要完善的請指出,謝謝!