在Javascript中克隆对象,维护instanceof

cloning an object in Javascript maintaining instanceof

本文关键字:维护 instanceof 对象 Javascript      更新时间:2023-09-26

我想在Javascript中克隆一个对象。我:

 iPath = function () { this.heading = 0; this.path = []; };
 loop = new iPath();

我知道我可以用jQuery做这样的事情:

 cloneLoop = $.extend(true, {}, loop);

but

 assert(cloneLoop instanceof iPath, "fails because loop is not an iPath");

我如何做一个深度克隆实现最后断言语句?

这个怎么样:

cloneLoop = $.extend(true, new iPath(), loop);

…虽然我不确定你是否想做一个深度拷贝。我觉得这样更好:

cloneLoop = $.extend(new iPath(), loop);

Extend只是将属性从一个对象复制到另一个对象。所以你必须从你想要复制到的对象的原始副本开始。所以用new iPath()代替{}

var iPath = function () { this.heading = 0; this.path = []; };
loop = new iPath();
cloneLoop = $.extend(true, new iPath(), loop);
alert(cloneLoop instanceof iPath);

如果不支持旧版本的浏览器,您应该能够使用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)

您需要编写自己的clone方法:

类似以下语句的内容:

iPath.prototype = {
  clone: function () {
    var p;
    p = new iPath();
    $.extend(true, p, this);
    return p;
  }
}
cloneLoop = loop.clone();