如何让函数在其创建时调用自己的函数

时间:2015-10-10 17:00:35

标签: javascript class

我有一个功能PublicGame,我喜欢使用类似于类。当我创建PublicGame时,我通过设置this.methodName = function为它提供了一堆方法。唯一的事情是我想在创建PublicGame时调用其中一些方法。现在我做this.judge = this.setJudge(),但我知道这不会在我拥有它的地方工作,因为setJudge还没有定义。我应该把它放在PublicGame的底部吗?我的设计完全关闭了吗?
代码:

'use strict';

// var GameSockets = require(‘GameSockets’);
var Games = {};
var id_counter = 0;
var minPlayers = 3;
var maxPlayers = 6;

function PublicGame (players) {
    this._id = id_counter++;
    this.players = players;
    this.gameSocket = new GameSockets.registerPlayers(this.players, this._id, this.playerDisconnects);

    this.judge = this.setJudge();

    this.killGame = function() {
        delete Games[this._id];
    };

    // When a player presses leave game
    this.playerExits = function(playerToRemove) {
        // Delete player from players array
        this.players.splice(this.players.indexOf(playerToRemove),1);

        // If less than min players
        if (this.players.length < minPlayers) this.killGame();

        // If less than max players
        if (this.players.length < maxPlayers) {
                this.needsPlayers = true;
        }

       gameSockets.kickPlayer(playerToRemove);
    };

    // When a player disconnects without warning, e.g. closes window
    this.playerDisconnects = function(playerToRemove) {
        // Delete player from players array
        this.players.splice(this.players.indexOf(playerToRemove),1);

        // If less than min players
        if (this.players.length < minPlayers) this.killGame();

        // If less than max players
        if (this.players.length < maxPlayers) {
                this.needsPlayers = true;
        }
    };

    this.selectJudges = function() {
        this.judge = this.players.pop();
        this.players = this.players.unshift(this.judge);
    };

    this.setWinner = function(winner) {
        this.winner = winner;
    };



    Games[this._id] = this;
}

2 个答案:

答案 0 :(得分:1)

如果在原型上定义函数,则不需要“等待”定义函数,因为实例在调用构造函数的代码时已经有了它们

function PublicGame (players) {
  //...
  this.judge = this.setJudge();
}

PublicGame.prototype.killGame = function(){
  //...
};

PublicGame.prototype.playerExits = function(playerToRemove){
  //...
};

PublicGame.prototype.setJudge = function(){
  //do whatever
  return whatever;
};

因此,除非你的函数需要访问一些“私有”变量(即在构造函数中定义,而不是全局变量),或者需要它的其他原因,在原型上定义它而不是在构造函数中定义它,它将是随时可以使用。

答案 1 :(得分:0)

您必须使用javascript prototype

阅读代码示例中的注释。

&#13;
&#13;
/*
* utils functions
*
*    dont take care about that
**/
var el = document.getElementById('dbg');
var jj = function(val,sep){return JSON.stringify(val , null , sep || '')}
var log = function(val){el.innerHTML+='<div><pre>'+val+'</pre></div>'};
var counterId = 0;
/************************************************************************/

// You have to use prototype
// here an example of what you can achieve


// we create a Player 'class'
var Player = function( name ){ 
  this.id = counterId ++; //<-- an attribute
  this.name = name; //<-- an attribute
  this.setLevel(5);//<-- a method called at 'instanciation'
  
  return this;
};

// a method available at instanciation time
Player.prototype.setLevel = function(level){
    this.level = level;
  return this;
};


// we create a new Player named Toto
var Toto = new Player('Toto');
    log('Toto = ' + jj(Toto));//<-- utility function just to log

// we create a new Player named Jane
var Jane = new Player('Jane');
    log('Jane = ' + jj(Jane)); //<-- utility function just to log

// we change the Level of Jane
Jane.setLevel(12);

log('Jane.setLevel(12)');//<-- utility function just to log
log('Jane = ' + jj(Jane));//<-- utility function just to log
&#13;
<div id='dbg'></div>
&#13;
&#13;
&#13;