4

JavaScript について質問があります。現在、以下のコードに似たコードを使用しています。

function Game() {

}

オブジェクトをネストしたいので、次のようにアクセスできます。

var a = new Game();
a.nested_object.method();
a.nested_object.property;

どうすればこれを行うことができますか?関数と {} のどちらを使用しますか? それとも問題ですか?以下のコードは、私が言及しているもののサンプルコードです。

function Game() {

this.id;

var stats = {};

}

上で述べたように、次のように統計にアクセスできますか?

var a = new Game();
a.stats
4

6 に答える 6

6

私はこれを行います:

function Game() {
    this.id;
    this.stats = new Stats(this);
}

function Stats(game) {
    this.property;
    this.method = method;

    function method() {
        this.property;
        game.id;
    }
}

var game = new Game;
game.stats.method();

その理由は次のとおりです。

  1. 関心の分離-ゲームコンストラクターはゲームロジックに完全に集中でき、統計コンストラクターはゲームの統計にのみ集中します。
  2. モジュール性-ゲームコンストラクターと統計コンストラクターを2つの異なるファイルに入れることができます。これにより、それらを個別に処理でき、プロジェクトの管理が容易になります。
  3. 緩い結合-統計オブジェクトは、ゲームオブジェクトについて知る必要はありません。したがって、ゲームオブジェクトから分離することをお勧めします。代わりにオブジェクトリテラル表記を使用して作成した場合(@Bergiのように)、statsオブジェクトはゲームオブジェクトのプライベートメンバーにアクセスできます(statsオブジェクトが誤ってゲームオブジェクトのプライベートプロパティを変更した場合、逆効果になる可能性があります) )。
  4. 読みやすさ-@Bergiのコードと私のコードを比較してください。統計とゲームオブジェクトを分離すると、コードが読みやすく、理解しやすくなります。コードを一目見れば、何が起こっているのかを正確に知ることができます。
于 2013-01-11T02:28:43.833 に答える
2

はい、まさにその通りです。

あなたのwill のthisキーワードは、インスタンスではなくmethod()を保持することに注意してください。次を指す変数を使用することによってのみ、それへの参照を取得できます。nested_objectGame

function Game() {
    var that = this; // the Game instance
    this.id = …;
    this.nested_object = {
        property: "nested!",
        method: function() {
            this.property; // nested! (=== that.nested_object.property)
            that.id // the game property
        }
    };
}
var game = new Game;
game.nested_object.method();

そのため、プロトタイプ (インスタンスを含む変数がない場所) でネストされたオブジェクトはほとんど意味がありません - Crockford の Prototypal inheritance - Issues with nested objects を参照してください。

于 2013-01-11T01:35:07.383 に答える
0

これはもっと適切なはずです

function Game() {
  this.id;
  this.stats = "Hello";
  return this;
}

var a = new Game();
alert(a.stats);

基本的にあなたの場合stats is a local variable、作成されたオブジェクトは変数について何も知りません。

フィドルをチェック

于 2013-01-11T01:50:52.250 に答える
0

「ネストされた」ものをthisまたは に追加しGame.prototypeます。

于 2013-01-11T01:32:35.383 に答える
0

[以下のコメントに対応するように編集]

これはどう:

function Game() {

    this.nested_object = {
        method: function () {
            return 'method return value';
        },

        property: 'property value'
    };

};

var a = new Game();
alert( a.nested_object.method() );
alert( a.nested_object.property );
于 2013-01-11T01:33:43.230 に答える
0

コンストラクターでネストされたオブジェクトを作成するだけです。

function Game() {
    this.stats = { lives: 3 };
};

var a = new Game();
-- a.stats.lives;

ただし、実装ではasGameを参照する必要があるため、これは煩わしい場合があります。たとえば式の中で間違ったものを参照すると、それらが合計され、混乱が生じる可能性があります。statsthis.statsthisthisfunction(){}

私の好きなパターンはこんな感じです。これは基本的に、古典的な OO ゲッター関数です。

function Game() {
    var stats = { lives: 3 };
    this.stats = function() { return stats; };
};

var a = new Game();
-- a.stats().lives;
于 2013-01-11T01:34:28.383 に答える