12 回复

支持下楼主

2.3 使用Object.create()方法

直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。

/* ================ 深拷贝 ================ */
function deepClone(initalObj, finalObj) {
    var obj = finalObj || {};
    for (var i in initalObj) {
        var prop = initalObj[i];

        // 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
        if(prop === obj) {
            continue;
        }

        if (typeof prop === 'object') {
            obj[i] = (prop.constructor === Array) ? [] : Object.create(prop);
        } else {
            obj[i] = prop;
        }
    }
    return obj;
}

这个感觉好像有问题

@jiangli373 好像是有点问题,我看看

@jiangli373

obj[i] = (prop.constructor === Array) ? [] : Object.create(prop);

改成

obj[i] = (prop.constructor === Array) ? prop : Object.create(prop);

就可以了,写错了

function deepClone(initalObj, finalObj) {
	var obj = finalObj || {};
	for (var i in initalObj) {
		var prop = initalObj[i];

		// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
		if(prop === obj) {
			continue;
		}

		if (typeof prop === 'object') {
			obj[i] = (prop.constructor === Array) ? prop : Object.create(prop);
		} else {
			obj[i] = prop;
		}
	}
	return obj;
}

var obj = {
	 a:{
	 	   'name':'jiang',
		 'age':30
	 },
	b:[{a:'name'},2,3]
};
var nw = deepClone(obj,{});

console.log(nw)    //{ a: {}, b: [ { a: 'name' }, 2, 3 ] }
nw.b[0].b = 'helklo';
console.log(nw)  //{ a: {}, b: [ { a: 'name', b: 'helklo' }, 2, 3 ] }
console.log(obj) //{ a: { name: 'jiang', age: 30 },b: [ { a: 'name', b: 'helklo' }, 2, 3 ] }

貌似还是有问题

@jiangli373 ^_^不知道哪里出了问题,应该是数组还要做一层判断

@jiangli373 但是你上面的验证中没有改变老对象啊??

@cllgeek 对 我的意思是用Object.create的话 老对象改变会影响新对象 和我上面的那个例子没有关系

mark 有时间学习一下

极客教程是什么

来自酷炫的 CNodeMD

@sc-yuns 我自己的一个项目

回到顶部