天天看點

實作對象深拷貝的簡單案例

代碼

function deep() {
        var length = arguments.length;
        if (length <= ) {
            if (length === ) {
                return deep({}, arguments[]);
            }
            else if (length === ) {
                deepCopy(arguments[],arguments[]);
            }
            else  {
                return {};
            }
        }
        else {
            for (var i = ; i < length; i++) {
                deepCopy(arguments[],arguments[i]);
            }
        }
        return arguments[];
        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對象,後面的對象優先級高,可以傳多個對象

繼續閱讀