2011-12-21 34 views
1

我想用Javascript克隆一个对象。我有:在Javascript中克隆一个对象维护instanceof

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

“深”扩展意味着子对象也将被合并。 'extend'不克隆一个对象,它也不保存原型链。 – zzzzBov 2011-12-21 18:15:45

回答

2

如何:

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

...虽然我不知道,如果你想要做一个深拷贝。我认为这将是更好的:

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

+1很好地完成,并应该在所有浏览器上工作 – 2011-12-21 18:18:29

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)

+1

+1似乎将其设置为原型对象将是一个很好的解决方案。对于旧版浏览器,您可以使用典型的“Object.create”补丁。 'function create(proto){function f(){} f.prototype = proto;返回新的f; }' – 2011-12-21 23:04:39

0

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

线沿线的东西:

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

从一个对象扩展简单的拷贝属性到另一个。所以你必须从你想复制的对象的原始拷贝开始。因此请使用new iPath()而不是{}

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

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

alert(cloneLoop instanceof iPath);