1

私がやろうとしているのは、Javascriptオブジェクトのclone()関数を作成することです。ご存知のように、Javascriptにこのためのネイティブ機能がないことは、苦痛になる可能性があります。私にはそれを行うための素晴らしい方法がありますが、使いやすさに関しては、それは厄介です。これまでの関数は次のとおりです。

function clone(objectToClone) {
    var myClone = function() {};
    myClone.prototype = objectToClone;
    return [
        new myClone(),
        new myClone()
    ];
}

ご覧のとおり、現在、両方のクローンを含む配列を返しています。これにより、使用法は次のようになります。

// usage
var bar = new foo();
bar = clone(bar); // forks bar into two separate copies of bar (awkward)
// bar[0] is now clone 1
// bar[1] is now clone 2

私がやりたいことは、次のようなことをすることができることです:

function clone(objectToClone) {
    var myClone = function() {};
    myClone.prototype = objectToClone;
    objectToClone = new myClone(); // somehow magically?
    return new myClone();
}

// usage
var bar = new foo();
var baz = clone(bar); // returns a copy, and bar is now one of the copies as well.
// bar is now clone 1
// baz is now clone 2

残念ながら、引数の割り当ては呼び出し元のスコープに影響を与えないため、これは機能しません。しかし、誰かがjsのトリックを考えて、目的のマナーで関数を使用できるようになることを期待していました。どんなアイデアでも大歓迎です。

4

3 に答える 3

0

オリジナルをそのままにして、クローン関数にコピーを返すようにすることができます。

これが何らかの理由で不可能または非現実的である場合、それがあなたができる最善のことです:

var bar = new foo();
var clones = clone(bar);
bar = clones[0];
barCopy = clones[1];

あなたが信じられないほどエレガントでないトリックに頼らない限りeval

あなたが本当に望んでいるのはreturn new myClone()、絶対に使わないことだと思いますbarbar_templateこれにより、元のテンプレートのクローンを作成できるようになったため、実際には少しエレガントになります(必要に応じて、何かと呼ぶことができます)。

于 2012-04-26T22:41:58.800 に答える
0

あなたは私に私のコメントを説明してほしかった、ここに行く:

function replaceClones(){
    for(var i = 0; i < arguments.length; i++){
        var varName = arguments[i];
        this[varName] = getClone(this[varName]);
    }    
}

function getClone(obj){
    var Clone = function(){};
    Clone.prototype = obj;
    return new Clone();
}

replaceClones("varA","varB");

別のスコープが必要な場合は、

replaceClones.call(newScope,"varA","varB");
于 2012-04-26T22:59:15.040 に答える
0

目的の結果を得るには、プロパティを持つオブジェクトを渡してから、それらのプロパティを変更する必要があります。これは、元のファイルを変更できるJavaScriptで参照を取得するための最良の方法です。通常の関数の引数として渡されただけの場合、元の値を変更することはできません。Javascriptにはこれらのタイプの参照はありません。

function clone(holder) {
    var myClone = function() {};
    myClone.prototype = holder.input;
    holder.input = new myClone(); // somehow magically?
    return new myClone();
}

// usage
var holder = {};
var holder.input = new foo();
var holder.output = clone(holder); // returns a copy, and holder.input is now a copy too
// holder.input is now clone 1
// holder.putput is now clone 2
于 2012-04-26T23:14:38.733 に答える