2

質問を曖昧に表現することはできませんでしたが、理解していただけると思います...

私は Javascript でゲーム エンジンを開発していSceneます。多くのもののコンテナーであるオブジェクトには、その中の 1 つの配列、特に描画できるすべてのものを保持する配列を変更するメソッドがあります。

この配列には、次のようにアクセスします。

scene.internals.draw

問題は、メソッド内で何度も参照されており、名前/パスが変更される可能性があることです。当然、配列のパスを変更するたびに、メソッド内のすべての参照を変更したくないので、次のようにしました。

var location = scene.internals.draw;

これで、実際のメソッド コードとアルゴリズムはそのまま維持できます。シーン内の配列の名前/パスが変更された場合でも、その 1 行を変更するだけで済みます。

そして、それはほとんどの場合、かなりうまく機能します。などはできます.push(obj)が、ある時点で、配列を「分割」する必要があります。つまり、次のように、配列を半分に分割し、何かを追加してから、元に戻す必要があります。

buff1 = location.slice(0, i); //First slice of the array.
buff2 = location.slice(i, location.length); //Second slice of the array.

//Add something in between those slices.
buff1.push(ob);
location = buff1.concat(buff2); //Problems here!

これは、配列を直接変更したため、locationただの場合にうまく機能しました。scene.internals.drawしかし今、新しい値を目的のlocation変数ではなく、ローカル変数に割り当てますscene.internals.draw!

質問: = 演算子を使用して、これらのオブジェクトへの参照を含む変数 ( など) の代わりに、「実際の」オブジェクトに値を割り当てるにはどうすればよいlocationですか?

明らかな解決策は、メソッドの最後にある次のとおりです。

scene.internals.draw = location.slice();

これは問題ありません。唯一の副作用は、元の名前を 2 回書き、2 回編集する必要があることですが、これはそれほど大きな問題ではありません。しかし、私はその機能が必要な他の状況にいるかもしれないので、まだ答えが欲しい.

4

2 に答える 2

2

JavaScriptには参照による代入がないため、これを行うことはできません。あなたがしていることは、通常、参照による割り当てと誤解されますが、実際には、このような意味を持つ参照値のコピーです。

あなたはこれをやっているので、おそらくどこかでより深い問題を抱えているでしょうが、私はそれには入りたくありません.

あなたはこれを行うことができます:

location.splice( 0, location.length ); //Remove all items in the array
location.push.apply( location, buff1.concat(buff2) ); //Push the buffers into the array
于 2012-07-16T21:03:14.043 に答える
2

あなたの用語を使用すると、Javascript には「実際の」オブジェクトはありません。オブジェクトと、それらへの参照を保持する変数だけがあります。

に割り当てると、オブジェクトへの追加の参照がlocation作成されます。システムは、それがどの「実際の」オブジェクトであったか、またそれへの参照を保持している可能性のある他の変数を認識していません。

したがって、再割り当てするlocationと、その特定の参照が上書きされます。オブジェクトへの他の元の参照は、それらがあった場所を指したままになります。

于 2012-07-16T21:06:12.990 に答える