在node.js中克隆对象的最佳方法是什么
例:我想避免以下情况:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
对象很可能包含复杂类型作为属性,所以简单的for(var x in obj1)解决不了问题。我需要自己写一个递归克隆吗?还是有一些我没有看到的内置的东西?
在node.js中克隆对象的最佳方法是什么
例:我想避免以下情况:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
对象很可能包含复杂类型作为属性,所以简单的for(var x in obj1)解决不了问题。我需要自己写一个递归克隆吗?还是有一些我没有看到的内置的东西?
当前回答
没有一个答案让我满意,一些不工作或只是肤浅的克隆,答案来自@clint-harris和使用JSON。Parse /stringify很好,但是很慢。我找到了一个可以快速进行深度克隆的模块:https://github.com/AlexeyKupershtokh/node-v8-clone
其他回答
var obj2 = JSON.parse(JSON.stringify(obj1));
在寻找一个真正的克隆选项时,我偶然发现了一个可笑的链接:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
我修改了该页上的解决方案,以便附加到Object原型的函数是不可枚举的。这是我的结果:
Object.defineProperty(Object.prototype, 'clone', {
enumerable: false,
value: function() {
var newObj = (this instanceof Array) ? [] : {};
for (i in this) {
if (i == 'clone') continue;
if (this[i] && typeof this[i] == "object") {
newObj[i] = this[i].clone();
} else newObj[i] = this[i]
} return newObj;
}
});
希望这也能帮助到其他人。注意,这里有一些注意事项……特别是对于名为“clone”的属性。这对我来说很有效。这不是我写的。同样,我只是改变了它的定义方式。
你可以使用JQuery的extend函数:
var newClone= jQuery.extend({}, oldObject);
var deepClone = jQuery.extend(true, {}, oldObject);
还有一个Node.js插件:
https://github.com/shimondoodkin/nodejs-clone-extend
要做到没有JQuery或插件阅读这里:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
另一个解决方案是直接封装在新变量中使用: 其中obj1 ={…methoda}
这段代码也是object .create()方法使用指定的原型对象和属性创建一个新对象的原因。
var obj1 = {x:5, y:5};
var obj2 = Object.create(obj1);
obj2.x; //5
obj2.x = 6;
obj2.x; //6
obj1.x; //5