7

オブジェクトの作成時にそのオブジェクト内にオブジェクトのコピーを保存できますか?

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

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

オブジェクト内で初期化されたときにオブジェクトのコピーを作成したいと思います。私はこれを思いついた:

function student(id, name, marks){
    this.id = id;
    this.name = name;
    this.marks = marks;
    this.baseCopy = this;
}

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

1.これは、オブジェクトの作成時にそのオブジェクト内に初期値を持つオブジェクトのコピーを保存できるようにするために、どのように可能ですか?

4

3 に答える 3

7

すでにjQueryを使用しているので、一般的な答えは次のとおりです。

this.baseCopy = $.extend(true, {}, this);

再帰的にそれ自体を参照することなく、その時点で存在するプロパティ値の「ディープ」コピーを生成します。

-一般的なJSコードをいくつか含めましたが、OPによって質問が完全に変更されたため、jQueryを使用するだけに戻す方が簡単です。もちろん、これはオブジェクトに直接存在するすべてのメソッドをコピーしますが、適切に記述されていれば、これらのメソッドはオブジェクトのプロトタイプにあります。

于 2012-12-20T09:02:51.380 に答える
2

jQueryを使用しない代替手段:(
それがなくても実行できることをご存知のとおりです。)

function student(id, name, marks){
    this.id = id;
    this.name = name;
    this.marks = marks;

    var tempCopy = {}; // Initialize a temporary variable to copy the student to.
    for(key in this){   // Loop through all properties on this (student)
        if(this.hasOwnProperty(key)){ // Object.prototype fallback. I personally prefer to keep it in, see Alnitak's comment.
            tempCopy[key] = this[key]; // Copy the property
        }
    }
    this.baseCopy = tempCopy; // "Save" the copy to `this.baseCopy`
}

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

console.log(s.name + "'s marks were: ", s.baseCopy.marks);
console.log(s.name + "'s marks are: ", s.marks);
// Logs:
// Jack's marks were:  [5, 7]
// Jack's marks are:  [5, 7, 6, 8]

これの利点は、手動で「設定」することなく、学生のすべてのプロパティを自動的にコピーすることです。 また、jQueryを使用しないため、少し高速です。これは、大量のデータを処理する場合に重要になる可能性があります。baseCopy

于 2012-12-20T09:10:38.007 に答える
1

次の方法は私にとってはうまくいきます(最善の解決策ではないかもしれませんが、おそらくオブジェクトのプロトタイプを含む別の方法があります)

function BaseStudent(id, name, marks) {
    this.id = id;
    this.name = name;
    this.marks = marks;
}

function Student(id, name, marks) {
    this.baseCopy = new BaseStudent(id, name, marks);
    BaseStudent.call(this, id, name, marks);
}

var s = new Student(1, 'Name', 100);

console.log(s.id); // logs 1
console.log(s.name); // logs 'Name'
console.log(s.marks); // logs 100

s.name = 'AnotherName';

console.log(s.name); // logs 'AnotherName'
console.log(s.baseCopy.name);​ // logs 'Name'
于 2012-12-20T09:16:42.210 に答える