最佳答案
如何深度克隆 JavaScript 对象?
我知道有很多基于框架的函数,比如 JSON.parse(JSON.stringify(o))和 $.extend(true, {}, o),但是我不想使用这样的框架。
创建深度克隆的最优雅或最有效的方法是什么。
我们确实关心像克隆数组这样的边缘情况,不打破原型链,处理自引用。
我们不关心是否支持复制 DOM 对象,因为 .cloneNode的存在就是为了这个原因。
因为我主要想在 node.js中使用 V8引擎的 ES5特性来进行深度克隆是可以接受的。
[编辑]
在任何人提出建议之前,让我提一下,通过原型继承从对象创建副本和通过 克隆创建副本之间有着明显的区别。前者把原型链弄得一团糟。
[进一步编辑]
在阅读了你的回答之后,我得到了一个恼人的发现: 克隆整个对象是一个非常危险和困难的游戏。以下面基于闭包的对象为例
var o = (function() {
var magic = 42;
var magicContainer = function() {
this.get = function() { return magic; };
this.set = function(i) { magic = i; };
}
return new magicContainer;
}());
var n = clone(o); // how to implement clone to support closures
有没有办法编写一个克隆函数来克隆对象,在克隆时具有相同的状态,但是如果不在 JS 中编写一个 JS 解析器,就不能改变 o的状态。
现实世界不再需要这样的功能,这仅仅是学术兴趣。