我想在Javascript中克隆一个对象。我有:
iPath = function () { this.heading = 0; this.path = []; };
loop = new iPath();
我知道使用jQuery我可以做类似的事情:
cloneLoop = $.extend(true, {}, loop);
但不是
assert(cloneLoop instanceof iPath, "fails because loop is not an iPath");
如何进行深度克隆以完成最后一个断言语句?
答案 0 :(得分:2)
这个怎么样:
cloneLoop = $.extend(true, new iPath(), loop);
......虽然我不确定你是否想要做一个深层复制。我认为这会更好:
cloneLoop = $.extend(new iPath(), loop);
答案 1 :(得分:1)
如果不支持旧版浏览器,则应该可以使用Object.create:
var cloneLoop = Object.create(loop);
这是一个演示
function Foo() {
this.x = 1;
this.y = 1;
this.blah = { f: "a", g: "b" };
}
var f = new Foo();
var clone = Object.create(f);
alert(clone instanceof Foo);
alert(clone.blah.f);
提醒true
,然后是a
(至少在Chrome上,旧浏览器不支持Object.create)
答案 2 :(得分:1)
扩展只是将属性从一个对象复制到另一个对象。因此,您必须从要复制到的对象的原始副本开始。因此,请使用new iPath()
代替{}
。
var iPath = function () { this.heading = 0; this.path = []; };
loop = new iPath();
cloneLoop = $.extend(true, new iPath(), loop);
alert(cloneLoop instanceof iPath);
答案 3 :(得分:0)
您需要编写自己的clone
方法:
有些事情:
iPath.prototype = {
clone: function () {
var p;
p = new iPath();
$.extend(true, p, this);
return p;
}
}
cloneLoop = loop.clone();