私がやろうとしているのは、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トリッキーを思いつくのに役立つかもしれないことを望んでいました。どんなアイデアも大歓迎です。
なぜコピーがクローンを返さないようにしますか?あなたができることは、スコープ( 'window'のような)と1つ以上の変数の名前をあなたの関数に渡して、それをクローンで置き換えることです。 – muffel
あなたが言っていることを描写するのに困っている@muffel。あなたは答えを精緻化できますか? – dqhendricks
この 'clone'の実装について私がどのように感じるか分かりません。たとえば、オブジェクトのクローニングを続けると、任意の長いプロトタイプチェーンが作成されます(たとえばforループの一部としてクローンを作成していた場合など)。これがあなたの望むものなら、なぜ新しいmyCloneを返すのですか? *編集*:ああ、私は、バズはバーの副作用によって変更される可能性があります参照してください。 – ninjagecko