2012-12-20 7 views
6

これはMy Old Questionその作成したとき、私は、そのオブジェクトの内部で、オブジェクトのコピーを保存することができます - 続き:

これは、新しい学生のオブジェクトを作成し、私の機能であるの続きです:

function student(id, name, marks, mob, home){ 
    this.id = id; 
    this.name = name; 
    this.marks = marks; 
    this.contacts = {}; 
    this.contacts.mob = mob; 
    this.contacts.home = home; 

    this.toContactDetailsString = function(){ 
     return this.name +':'+ this.mob +', '+ this.home 
    } 
} 

オブジェクトの内部で初期化されたオブジェクトのコピーを作成したいと考えています。

function student(id, name, marks, mob, home){ 
    this.id = id; 
    this.name = name; 
    this.marks = marks; 
    this.contacts = {}; 
    this.contacts.mob = mob; 
    this.contacts.home = home; 

    this.toContactDetailsString = function(){ 
     return this.name +':'+ this.mob +', '+ this.home 
    } 
    this.baseCopy = this; //Not sure about this part 
} 

しかし、問題は、それが私に現在のオブジェクトのコピーの無限ループをbaseCopyに与えていることです。また、私のオブジェクトの属性を更新すると自動的に更新されます。

1.初期値を持つオブジェクトのコピーをオブジェクトの内部に保存することはできますか?

2.それは私は、これはハードコーディング属性名なしで、純粋なJSに

+0

"baseCopy"にオブジェクトのコピーを割り当てずに参照を割り当てます。コピーが行われないので、 "baseCopy"は常に最新の状態です。実際のコピーを入手する方法を知るには、たとえばhttp://api.jquery.com/jQuery.extend/をご覧ください。 – Niko

+0

'this'はこの文脈で' window'オブジェクトを参照しているようです。 – Stefan

+0

それで、回答のいずれかがあなたのために掲載されましたか? – Cerbrus

答えて

3

あなたの前の質問に私の答えは、あなたがオブジェクトのコピーを作成するために、このコードを使用することができますし、それはないが、それが機能だコピー-INGの、プロパティを入れ子にはかなり多くのように:「

function student(id, name, marks, mob, home){ 
    this.id = id; 
    this.name = name; 
    this.marks = marks; 
    this.contacts = {}; 
    this.contacts.mob = mob; 
    this.contacts.home = home; 

    this.toContactDetailsString = function(){ 
     return this.name +':'+ this.mob +', '+ this.home 
    } 

    // Copy the object to baseCopy 
    this.baseCopy = clone(this); // "clone" `this.baseCopy` 
} 

function clone(obj){ 
    if(obj == null || typeof(obj) != 'object'){ // If the current parameter is not a object (So has no properties), return it; 
     return obj; 
    } 

    var temp = {}; 
    for(var key in obj){ // Loop through all properties on a object 
     if(obj.hasOwnProperty(key) && !(obj[key] instanceof Function)){ // Object.prototype fallback. Also, don't copy the property if it's a function. 
      temp[key] = clone(obj[key]); 
     } 
    } 
    return temp; 
} 

var s = new student(1, 'Jack', [5,7], 1234567890, 0987654321); 
s.marks = s.marks.concat([6,8]); // Jack's gotten 2 new marks. 

console.log(s.name + "'s marks were: ", s.baseCopy.marks); 
// Jack's marks were: [5, 7] 
console.log(s.name + "'s marks are: ", s.marks); 
// Jack's marks are: [5, 7, 6, 8] 
console.log(s.baseCopy.toContactDetailsString); // check if the function was copied. 
// undefined 
console.log(s.baseCopy.contacts.mob); 
// 1234567890 

(I深刻なコピーを1秒間実行します)

「深い」コピーが今すぐ動作するはずです。

3
を使用することにより可能であるかどうかを知ることは非常に好奇心が強い

3.機能をコピーしないようにすることができます

this.baseCopy = this;という名前でコピーを作成していない場合は、この内部変数への参照を設定するだけです。だから、baseCopyも、あなたが渡された学生のオブジェクトから新しい学生オブジェクトを返し、その後BaseCopy

1
this.baseCopy = new student(id, name, marks); 

としてあなたの方法だけで循環参照を作ることを格納する方法を作成する必要が同じオブジェクトを

を指しています。 newを使用して新しいオブジェクトをインスタンス化します。

これを使用すると、おそらく無限の再帰になります。

あなたはこのようにこれを回避することができます

function student(id, name, marks, flag) { 
    // usual code... 
    // And: 
    if (!flag) { 
     this.baseCopy = new student(id, name, marks, true); 
    } 
} 

この方法は、唯一のトップの学生はbaseCopyを持っています。

+0

これはおそらく動作しません。あなたが同じ入力を持つコピーを新しいものにすると、新しいコピーはおそらく新たな別のコピーになります。これは新しく別のコピーになります。 – user1600124

+0

@ user1600124これを考慮に入れて編集しました:) –

+0

このように.. baseCopyはまだstudentのインスタンスであり、そこに定義されている関数を持つ必要があります – user1600124

1

うーん...

this.baseCopy = this; 

は、基本的には、オブジェクトのbaseCopyはオブジェクトそのものであることを意味します。したがって:

var abc = new student(someId, someName, someMarks); 

abcとabc.baseCopyは実際には同じオブジェクトを指しています。 多分にbaseCopyを変更されて何ができます。

this.baseCopy = { id: id, name: name, marks: marks, contact: {mob:mob, home: home}} 

基本的に手動でオブジェクトへの入力のコピーを作成します。 入力のいずれかが参照型である場合、コピーは依然として元のオブジェクトと同じオブジェクトを指していることに注意してください。

+0

まだメソッドが必要です。 –

+0

彼は機能をコピーしないことが可能かどうか尋ねました... – user1600124

+0

ああ、私の悪い:-) –

関連する問題