Node.js和面向对象的Javascript

时间:2014-08-23 15:52:05

标签: javascript node.js

我正在创建一个允许与Node.js和Socket.io建立两个套接字连接的游戏。有一个"主持人"和"加入"功能。首先主机连接,但我想确保它们不能再连接到另一个游戏,所以我输入一个条件来检查是否已为该套接字创建了游戏对象。由于某种原因,(使用下面使用的简化代码),Game对象不会与UserSocket对象一起保存。我认为这是一个范围问题,但不是很确定。

function Game(gameid) {

    this.gameID = gameid;
    this.joined = false;
    this.active = false;
    this.baseball = false;

}

function UserSocket(sock) {

    o = this;

    o.sock = sock;

    o.sock.on('clientData', function (data) {

        o.CreateGame(data);

    });

    o.CreateGame = function (hostdata) {

        console.log('in create game');
        --->console.log(o.game); //*** this call always returns null

        if (o.game) {

            console.log('game already started');  // this never happens
            return false;
        }

        newgame = new Game(hostdata);

        console.log("game object created");
        console.log(newgame.gameID);

        newgame.host = o.sock;
        o.game = newgame;

        console.log(o.game);
        arrGames.push(newgame);

        o.SendToHostSocket("Hosting game: " + newgame.gameID );

    } 

}

1 个答案:

答案 0 :(得分:1)

你至少需要改变:

function UserSocket(sock) {

    o = this;

    ...

到此:

function UserSocket(sock) {

    var o = this;

    ...

你拥有它的方式,o是一个隐含的全局变量。如果有人第二次调用new UserSocket(),您将覆盖o中的值,然后您的第一个套接字将无法正常工作。


在Javascript中,所有仅在函数内使用的变量在第一次声明时都应以var开头。如果你把它排除在外,那么它们就会成为所有代码都可以访问的“隐式全局变量”,并且会被无意中覆盖。隐式全局变量是一种糟糕的编码实践,通常会导致错误,事实上,如果您在严格模式下运行代码,这会导致错误,代码甚至无法运行。