2011-12-21 5 views
1

Javascriptでオブジェクトをクローンしたいと思います。私が持っている:Javascriptでオブジェクトをクローンするinstanceofを維持する

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

が、私は最後のassert文を満たす深いクローンをどのように行うことができます

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

より:

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

は、私はjQueryを使って私のような何かを行うことができます知っていますか?これについて

+0

「深い」拡張子は、サブオブジェクトもマージされることを意味します。 'extend'はオブジェクトをクローンしません。プロトタイプチェーンも保存しません。 – zzzzBov

答えて

2

方法:

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

...私はあなたが深いコピーをしたいと思いますかはわからないけれども。私はこれが良いだろうと思うだろう:

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

+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をサポートしません)

+1

+1プロトタイプオブジェクトとして設定するとよい解決策になりそうです。古いブラウザでは、典型的な 'Object.create'パッチを使うことができます。 '関数の作成(proto){関数f(){} f.prototype = proto;新しいfを返します。 } ' –

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); 
関連する問題