实现对象深拷贝的简单案例

代码

function deep() {
        var length = arguments.length;
        if (length <= 2) {
            if (length === 1) {
                return deep({}, arguments[0]);
            }
            else if (length === 2) {
                deepCopy(arguments[0],arguments[1]);
            }
            else  {
                return {};
            }
        }
        else {
            for (var i = 1; i < length; i++) {
                deepCopy(arguments[0],arguments[i]);
            }
        }
        return arguments[0];
        function deepCopy(newObj,oldObj) {
            for (var i in oldObj) {
                if (typeof oldObj[i] === 'object') {
                    if (oldObj[i].constructor === Array) {
                        // 如果属性为数组的情况下
                        newObj[i] = [];
                    }
                    else if (oldObj[i] instanceof HTMLElement || oldObj[i] === window) {
                        // 如果属性为dom对象或者window对象的情况下
                        newObj[i] = oldObj[i];
                    }
                    else {
                        // 如果属性为纯粹对象的情况下
                        if(!newObj[i] || !(newObj[i] instanceof Object)) {
                            newObj[i] = {};
                        }
                    }
                    deepCopy(newObj[i],oldObj[i]);
                }
                else {
                    newObj[i] = oldObj[i];
                }
            }
            return newObj;
        }
    }

使用方法

  • deep(a,b) 返回扩展后的a对象,a对象有b对象的所有属性值
  • deep({},a,b)返回一个新对象,新对象包括a对象和b对象的所有属性值,有相同属性时b对象的会覆盖a对象,后面的对象优先级高,可以传多个对象

猜你喜欢

转载自blog.csdn.net/wangcuiling_123/article/details/78446837