0

動作しない JavaScript コードがいくつかあります。いくつかのものを動かしたり、いくつかのキーワードを変更したりしてみましたが、今のところ何もうまくいきません. 私はあなたたちにそれを試してもらいます。

これはJavaScriptファイルです:

    var GAME = {

  /////////////////////////////
  // GAME PROPERTIES         //
  /////////////////////////////

  /* LAYOUT PROPERTIES */
  ROWS: 3,
  COLS: 3,
  CELLS: {
    TOTAL: ROWS * COLS,
    CELL_SIZE: 25,
  },

  /////////////////////////////
  // GAME METHODS            //
  /////////////////////////////

  display: function() {

    alert( "ROWS: " + ROWS );
  }

};

別の HTML Web ページで、次のコードを使用しています。

<script type="text/javascript">
<!--
GAME.display();
//-->
</script>

コードを firebug で実行したところ、次のエラーが発生しました。

TypeError: GAME is undefined

試してみましたが、エラーが消えません。ヘルプ!

提供される完全な HTML:

<!doctype html>
<html>
  <head>

    <meta charset="utf-8">
    <title>JavaScript Canvas | Tic-Tac-Toe</title>

    <style type="text/css">
    #canvas01 {
      border: 1px solid #000;
    }
    </style>


    <!-- JQUERY -->

  </head>
<body>


<div id="canvas01"></div>

<script type="text/javascript" src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.3.1.min.js"></script>

<script type="text/javascript" src="game/core.js"></script>

<script type="text/javascript">

GAME.display();


</script>

</body>
</html>
4

3 に答える 3

1

@danronmoon は正しい軌道に乗っています。

まず、これがネストされたオブジェクトでいっぱいの 1 つの BIG オブジェクトになる場合、オブジェクトが作成されるまで、他のプロパティに割り当てるための値にアクセスできません。

var obj = {
    a : 1,
    b : 2,
    c : a + b // won't work for 2 reasons
};

次に、プロパティを関数内の変数に割り当てるか、完全なチェーンを参照しない限り、プロパティを参照することはできません。

var obj = { a : 1, b : 2, c : null };

obj.c = obj.a + obj.b;
obj.c; // 3

今では動作します。

または:

var obj = {
    a : 1,
    b : 2,
    c : null,
    initialize : function () {
        obj.c = obj.a + obj.b;
    }
};

obj.initialize();

また

var obj = {
    // ...
    initialize : function () {
        this.c = this.a + this.b;
    }
};

最後の形式の 1 つの警告: this関数よりも 1 レベル高いレベルを指すため、関数の兄弟にしかアクセスできません。

var obj = {
    level : 1,
    init : function () {
        // this === obj
    },
    nested : {
        level : 2,
        init : function () {
            // this === obj.nested
        },
        nested : {
            level : 3,
            init : function () {
                // this === obj.nested.nested
            }
        }
    }
};

への参照をオブジェクトにthis保存するか直接参照しない限り、を使用してチェーンの上位レベルにアクセスする方法はありません。parent

console.log( obj.nested.nested.level );

それが役立つことを願っています。

于 2013-01-20T21:14:31.720 に答える
1

以前の回答は良いですが、代わりにこの方法でゲーム オブジェクトを作成することを検討することをお勧めしたいだけです。

function Game() {
    var rows = 3,
        cols = 3,
        cells = {
            total: rows * cols, // no problem here
            cellSize: 25
        };
    this.display = function () {
        alert('ROWS: ' + rows); // or here
    };
}    
GAME = new Game();

こうすることで、プログラム ロジックを順番に記述し、変数と関数を定義する際に、常にオブジェクトのパブリックにアクセス可能なプロパティにする必要がなくなります。もちろん、複雑なデザイン パターンを使用してさらに進めることもできますが、私にとっては、これは開始するのに適した場所であり、OO JavaScript を使い始めたばかりの場合は直感に反することはありません。

于 2013-01-20T21:36:09.847 に答える
1

インスタンス化の時点で、同じオブジェクト内の別のプロパティに基づいてオブジェクトのプロパティを定義することはできません。現在、GAME の定義を妨げている原因は、TOTAL の割り当てです (JS ランタイムは、ROWS が最初に表示されるため未定義であるという TypeError をスローします)。オブジェクトのプロパティを定義するには、常にローカル変数を使用する必要があります。なぜなら、ゲームでいつ異なる要件が必要になるかは誰にもわかりません。thisまた、行数を表示する場合は、オブジェクトのコンテキストを指すように使用する必要があることに注意してください。次のようにする必要があります。

var rows = 3, cols = 3, cellSize = 25;

var GAME = {



/////////////////////////////
  // GAME PROPERTIES         //
  /////////////////////////////

  /* LAYOUT PROPERTIES */
  ROWS: rows,
  COLS: cols,
  CELLS: {
    TOTAL: rows * cols,
    CELL_SIZE: cellSize,
  },

  /////////////////////////////
  // GAME METHODS            //
  /////////////////////////////

  display: function() {
    alert( "ROWS: " + this.ROWS );
  }
};
于 2013-01-20T21:03:23.520 に答える