在Javascript维护instanceof中克隆对象

时间:2011-12-21 18:12:55

标签: javascript clone

我想在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");

如何进行深度克隆以完成最后一个断言语句?

4 个答案:

答案 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();