Object.assign 和 扩展运算符:

    Object.assign 和扩展运算符,都只会拷贝第一层,如果属性是一个对象,则当此对象发生改变时,复制出来的对象的相应属性也会发生改变。

    1. Object.assign
    2. ...obj

    JSON.parse(JSON.stringify(obj)):
    1. 当存在循环引用的时候,会发生异常,报错;
    2.属性为undefined或function的时候,则属性会丢失;因为undefined和function不能被json化;
    3.JSON.parse的参数,必须是一个标准的JSON串,也就是串中对应的属性名必须被双引号””括起来;

    1. var obj1 = {a: 11, b: 56, c: undefined};
    2. var obj2 = JSON.parse(JSON.stringify(obj1));

    深拷贝代码:

    1. // 深拷贝
    2. var deepClone = (obj) =>{
    3. var newObj = Array.isArray(obj) ? [] : {};
    4. if (obj && typeof obj === 'object') {
    5. for(let key in obj) {
    6. // 过滤掉不可枚举的属性和继承来的属性
    7. if (obj.hasOwnProperty(key)){
    8. if (obj[key] && typeof obj[key] === 'object'){
    9. newObj[key] = deepClone(obj[key]);
    10. }
    11. else {
    12. newObj[key] = obj[key];
    13. }
    14. }
    15. }
    16. }
    17. else {
    18. return obj;
    19. }
    20. return newObj;
    21. };
    22. var obj = {
    23. name: 'David',
    24. age: 26,
    25. friend: {
    26. name: 'Jim',
    27. age: 29
    28. }
    29. };
    30. var newObj = deepClone(obj);
    31. newObj.friend.age = 36;
    32. console.log(obj);
    33. console.log(newObj);

    混入Mixin:

    1. let mixin = {
    2. sing(){
    3. console.log('singing');
    4. },
    5. run(){
    6. console.log('running');
    7. }
    8. };
    9. class Student{
    10. constructor(name){
    11. this.name = name;
    12. }
    13. }
    14. Object.assign(Student.prototype, mixin);
    15. let stu = new Student('Jim');
    16. stu.sing();