6

これは私の古い質問の続きです

これは、新しい学生オブジェクトを作成する私の関数です。

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.関数をコピーしないことは可能ですか?

3.属性名をハードコーディングせずに、純粋なJSを使用してこれが可能かどうかを知りたいのですが、

4

4 に答える 4

3

あなたは言ってコピーを作成していません

this.baseCopy = this;、この内部変数への参照を設定しているだけです。したがって、baseCopyも同じオブジェクトを指しています

渡された学生オブジェクトから新しい学生オブジェクトを返すメソッドを作成し、それをBaseCopyとして保存する必要があります。

于 2012-12-20T09:44:04.790 に答える
3

前の質問に対する私の答えとほとんど同じように、このコードを使用して、オブジェクトとそのネストされたプロパティのコピーを作成できますが、その関数はコピーしません。

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

(私は少しの間ディープコピーに取り組みます)

「ディープ」コピーが機能するはずです。

于 2012-12-20T09:53:35.627 に答える
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を持っています。

于 2012-12-20T09:46:38.930 に答える
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}}

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

于 2012-12-20T09:48:17.760 に答える