今天看博客发现了深拷贝的一种写法:

function clone(o){
    var k, ret= o, b;
    if(o && ((b = (o instanceof Array)) || o instanceof Object)) {
        ret = b ? [] : {};
        for(k in o){
            if(o.hasOwnProperty(k)){
                ret[k] = clone(o[k]);
            }
        }
    }
    return ret;
}

  发现上述代码拷贝一般对象时可以使用,但是如果对象属性有类似new Date()对象时,拷贝出来的结果就有问题了。

  

  修改了一下方法:

function clone(obj){
        if(!obj || typeof obj != 'object' || (obj.__proto__.constructor !== Object.prototype.constructor && obj.__proto__.constructor !== Array.prototype.constructor))
            return obj instanceof Date ? new Date(obj) : obj;

        var result = {};

        if(obj instanceof Array)
            result = [];

        for(var i in obj){
            if(obj.hasOwnProoerty(i)
                result[i] = clone(obj[i]);
        }

        return result;
    }

 

  当然__proto__属性在ie下行不通,可列举类似Date、String等类型加以判断。

  还让大神指正!

posted on 2016-08-01 11:24  Scort  阅读(127)  评论(0编辑  收藏  举报