Object.assign 和 扩展运算符:
Object.assign 和扩展运算符,都只会拷贝第一层,如果属性是一个对象,则当此对象发生改变时,复制出来的对象的相应属性也会发生改变。
Object.assign
...obj
JSON.parse(JSON.stringify(obj)):
1. 当存在循环引用的时候,会发生异常,报错;
2.属性为undefined或function的时候,则属性会丢失;因为undefined和function不能被json化;
3.JSON.parse的参数,必须是一个标准的JSON串,也就是串中对应的属性名必须被双引号””括起来;
var obj1 = {a: 11, b: 56, c: undefined};
var obj2 = JSON.parse(JSON.stringify(obj1));
深拷贝代码:
// 深拷贝
var deepClone = (obj) =>{
var newObj = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for(let key in obj) {
// 过滤掉不可枚举的属性和继承来的属性
if (obj.hasOwnProperty(key)){
if (obj[key] && typeof obj[key] === 'object'){
newObj[key] = deepClone(obj[key]);
}
else {
newObj[key] = obj[key];
}
}
}
}
else {
return obj;
}
return newObj;
};
var obj = {
name: 'David',
age: 26,
friend: {
name: 'Jim',
age: 29
}
};
var newObj = deepClone(obj);
newObj.friend.age = 36;
console.log(obj);
console.log(newObj);
混入Mixin:
let mixin = {
sing(){
console.log('singing');
},
run(){
console.log('running');
}
};
class Student{
constructor(name){
this.name = name;
}
}
Object.assign(Student.prototype, mixin);
let stu = new Student('Jim');
stu.sing();