2

これをどう説明したらいいのかわからず、本当に困っています。それは私のコードの多くを台無しにしています。とにかく、これが基本的なものです。デフォルト設定など、いくつかの値を持つ構造体を保持する変数があるとします。

var DefaultValues = {
    username: "cakeisajoke",
    this: "is some",
    default: {
        data: 483
    },
    lives: 3,
    playerX: 0,
    playerY: 0
}

私のコードでは、この変数を「テンプレート」として使用しているため、ゲームを簡単にリセットできます。このような:

var GameValues = DefaultValues;

さて、これまでのところそれは理にかなっています。ここで、プレイヤーが命を落としたとしましょう:

GameValues.lives--;

または、プレーヤーは次のように移動します。

GameValues.playerX += 20;
GameValues.playerY -= 10;

これで、私の GameValues が変更され、ゲームをこれに設定しました。しかし、プレイヤーは失敗し、ゲームオーバーになります。彼がもう一度プレイしたい場合は、GameValues 変数をデフォルトにリセットするだけです。

GameValues = DefaultValues;

そして、私に関する限り、これは GameValues を DefaultValues に設定するだけですよね? しかし、そうではありません。何らかの理由で、GameValues と DefaultValues の値が同じであってはならないのに同じになるようになりました。たとえば、DefaultValues は、元の 1 ではなく 0 になりました。

なぜこれを行うのですか?私は見て、もう一度見て、最初の構造体を除いて、コード内のどこにも DefaultValues を設定していません。

「これとデフォルトを例として使用しました。予約されているため、実際には使用できないことがわかっています」

4

5 に答える 5

1

これは、JavaScript がオブジェクトの参照を使用するためです。したがって、オブジェクトを別のオブジェクトに割り当てると、それらは同じオブジェクトを指すようになります。オブジェクトのクローンを作成する必要があります。このスレッドでは、その方法をいくつか説明しています。

var GameValues = DefaultValues; //Both variables reference the same object
GameValues.lives--; //Since they both reference the same object this will change both the variables so to say

thisまた、 anddefaultをキーとして使用しないことも検討してください。これらは予約済みのキーワードです。

于 2013-11-11T08:17:35.990 に答える
1

現在の問題は、javascript がオブジェクトの参照を使用しているためです

このキングオブアプローチでは、このような他のjsパターンを使用できます

var DefaultValues = {
    username: "cakeisajoke",
    "this" : "is some",
    default: {
        data: 483
    },
    lives: 3,
    playerX: 0,
    playerY: 0
}

var GameValues =  Object.create(DefaultValues);

そして、あなたはすることができます

GameValues.lives--;
GameValues.playerX += 20;
GameValues.playerY -= 10;

デフォルトを変更せずに。

このモデリング・パターン・フォー・ジャバスクリプト・ブラウザー・ベース・ゲームを見てみる価値があります

于 2013-11-11T08:24:38.273 に答える
1

DefaultValuesオブジェクトを作成するときは、メモリ内にオブジェクトを作成し、変数にあるそのオブジェクトへの参照を作成しますDefaultValues

+--------------+ +-------------------------+
| | デフォルト値 |--------------->| ユーザー名: "cakeisajoke" |
+ ---------------+ | ライフ: 3 |
                                 | | (など) |
                                 +------------------------+

これを行うとき:

var GameValues = DefaultValues;

オブジェクトへの参照を 2 番目の変数に格納しているだけです。今、あなたはこれを持っています:

+--------------+
| | デフォルト値 |---+
+ ---------------+ | +------------------------+
                    | | | | ユーザー名: "cakeisajoke" |
                    +--------->| ライフ: 3 |
                    | | | | (など) |
+ ---------------+ | +------------------------+
| | ゲーム値 |---+
+--------------+

のコピーはありませんDefaultValues。オブジェクトへの参照が 2 つあるだけです。オブジェクトに加えた変更はオブジェクトを変更するため、使用する参照に関係なく自然に表示されます。

于 2013-11-11T08:25:03.603 に答える
0

割り当てを行うvar a = {}と、JavaScriptaはその値ではなく、新しく作成されたオブジェクトを参照して保存します。そのため、を介して設定を変更すると、のGameValues設定DefaultValuesも変更されます。これら 2 つは同じオブジェクトへの参照です。

などのプリミティブ型の新しい変数を初期化すると、実際の値var i = 1;に格納されるのでi

var i = 1;
var b = i;
var b += 4; // b is 5, i is still 1   

特定のタスクを解決するために、オブジェクトをトラバースする再帰関数を記述し、すべてのキーと値のペアのコピーを作成できます。この記事を参照してください。これを行う方法についての洞察が得られるはずです。

于 2013-11-11T08:17:50.757 に答える
0

DefaultValuesはオブジェクトであるため、オブジェクトに割り当てると、オブジェクト自体をコピーするのではなく、GameValues実際には参照を割り当てるだけです。つまり、一方のプロパティを設定すると、変更が他方に反映されます。

1 つの割り当てで行うのではなく、からプロパティをDefaultValueコピーすることで、これを回避できます。GameValue以下はその基本的な例ですが、ネストされたオブジェクトも処理する必要があることに注意してください。

Object.keys(DefaultValues).forEach(function (key) {
    GameValues[key] = DefaultValues[key];
});
于 2013-11-11T08:18:53.040 に答える