2012-01-11 19 views
2

javascriptオブジェクトをクローンする方法はありますか? DOM要素ではなく、特定のコンストラクタを持つオブジェクトです。たとえば、私は電話番号オブジェクトを持っていると言うことができます:複製/複製Javascriptオブジェクト

function PhoneNumber(number, type) { 
    this.number = number; 
    this.type = type; 
} 

var phoneObj1 = new PhoneNumber('1111111111', 'Home'); 
var phoneObj2 = //Copy of phoneObj1, but unique so I can set other parameters if necessary. 

jQueryはこの問題を拡張で解決します。代わりに電話番号のコンストラクタ名での

Object{number:'1111111111' type:'Home'} 

​​

は、しかし、それは一般的なオブジェクトを返します。私は元のphoneObj1のコンストラクタを渡す方法が必要です。実際には新しいPhoneNumber()をextendに書く必要はありません。これは、これが使用されているコードが多くの異なるタイプのオブジェクトによって使用されているからです。参照するオブジェクトがあるという事実を除いて使用されるコンストラクタです。

あなたはそれ以来、そのオブジェクトの種類のコンストラクタを返すか、単に自分自身のコピーを作成するいずれかのオブジェクトのあなたの異なったタイプ(右コンストラクタを呼び出し、それぞれに(おそらく copy()と呼ばれる)メソッドを持つことができ
var phoneObj2 = $.extend(new PhoneNumber(), phoneObj1); //I CANNOT do this! 

//Maybe something like this? 
var phoneObj2 = $.extend(new phoneObj1.constructor.name, phoneObj1); //This throws an error. 
+2

が重複する可能性を(のhttp://のstackoverflow。com/questions/122102/what-is-the-the-most-efficient-way-to-clone-a-javascript-object) – fyr

+0

ここでいくつかの良い答えhttp://stackoverflow.com/questions/332422/how-do-i -get-the-object-type-in​​-javascript – georg

+0

は 'fyr'と合意しました。私はこれを最も直接的な方法として打つだろう:Object.create(obj); – dbrin

答えて

1

それがどのような種類のオブジェクトであるかを知っている)。だから、すべてのオブジェクトに対して同じメソッドを呼び出すだけで、それはあなたのために機能します。

基本クラスにこの機能を追加すると、すべての派生クラスすべてでコンストラクタ関数が設定され、残りのコードはすべて共通になります。

0

var phoneObj2 = $.extend(new phoneObj1.constructor, phoneObj1); 

が作業を行うことが判明しました。私は、関連のないメモでphoneObj1のコンストラクタをキャンセルしていました。このため、実際のコンストラクタを明示的に記述しなくても、オブジェクトをクローン化する抽象的な方法として使用できます。私は単純に、私が複製しているオブジェクトからコンストラクタを継承できます。

0

私はあなただけの新しいObject.assign()メソッドを使用することができます(45)または34)の現代版をサポートする必要があります。

Object.assign()方法は、標的 オブジェクトに1つ以上のソースオブジェクトから全て 列挙独自のプロパティの値をコピーするために使用されます。ターゲットオブジェクトを返します。

var phoneObj2 = Object.assign({}, phoneObj1); 
console.log(phoneObj2); 

これは、phoneObj1のプロパティのすべてを取る空のオブジェクト{}にコピーし、phoneObj2として結合されたオブジェクトを返します。空の{}オブジェクトとphoneObj2変数は、assignメソッドを使用した後、メモリ内の同じオブジェクトを指します。詳細については

はMDNの情報チェックアウト:[?JavaScriptオブジェクトのクローンを作成するための最も効率的な方法は何ですか]のhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

+0

@ryandlf、私の答えがあなたのために働いていれば[投票する](https://stackoverflow.com/help/privileges/vote-up)または[accept](https://meta.stackexchange.com/questions/) 5234 /受け取り - 回答 - 仕事)それは? – Eric