如何创建仅存在于对象状态的变量?

时间:2017-01-25 02:31:23

标签: javascript scope game-engine javascript-objects phaser-framework

问题的标题可能不是最好的,但是到目前为止我写的代码是:

var menuState = {

    //state variables
   menuBttn: {
        x: _canvas.width/2, 
        y:_canvas.height/2, 
        img: imageArray[2], 
        over: false, 
        click: function() {
            changeState(2);
        }
    },

    preload: function () {

    },

    update: function(){
        surface.clearRect(0, 0, _canvas.width, _canvas.height);
        for (var i = 0; i < menuAssets; i++){
        surface.drawImage(//draw menuBttn);              
        }
    },

    exit: function(){

    },

};

我想要做的事实上是创建一个名为menuButtn(它是一个对象)的变量,它只存在于menuState中。

我以为我可以这样做:

var menuState = {

        //state variables
       this.menuBttn = {
            x: _canvas.width/2, 
            y:_canvas.height/2, 
            img: imageArray[2], 
            over: false, 
            click: function(){
                changeState(2);
            }
        },
    }

这是它在Phaser.io(一个制作游戏的库)中的工作方式,但我试图制作自己的游戏引擎。

我该如何解决?

3 个答案:

答案 0 :(得分:0)

我认为你做对了。菜单按钮仅存在于您创建的对象的范围内,因此其他类无法访问menuBttn,因为它位于menuState内。使用this关键字也非常智能。

另一个选项是创建一个make_button函数,用于创建一个新按钮,并在menuState对象内创建它。它完成了同样的事情。

答案 1 :(得分:0)

您可能正在寻找&#34;模块模式&#34;,它使用立即调用的函数表达式(IIFE)和闭包来创建&#34; private&#34;成员,例如

&#13;
&#13;
var foo = (function() {
  
  // Private function
  function bar(text) {
    console.log(text);
  }
  
  // Private variable
  var private = 'initial value';
  
  // Object to assign to foo
  return { runBar: function(text) {
                     bar(text);
                   },
           setPrivate: function(value) {
                     private = value;
                   },
           getPrivate: function() {
                     return private;
                   }
          };
}());

console.log(foo.runBar('bar text')); // bar text
foo.setPrivate('new value');
console.log(foo.getPrivate());  // new value
&#13;
&#13;
&#13;

有很多关于此的文章,开始搜索。 ; - )

答案 2 :(得分:0)

var menuState = (function () {
var menuBttn = {
    x: canvas.width / 2,
    y: canvas.height / 2,
    over: false,
    click: function () {
        console.log('clicked');
    }
};
var update = function () {
    console.log(menuBttn);
};
/* if you are in menuState scope then you can access menuBttn with out using menuState*/
console.log(menuBttn);
return{menuBttn: menuBttn, update: update};
})();

这样做,就像你在第一个例子中所做的那样。如果你使用&#34; menuState.menuBttn&#34;这允许你访问menuBttn。或者如果您想访问menuBttn属性。你可以&#34; menuState.menuBttn.x&#34;。此外,您无法将单行注释放在函数中。

    surface.drawImage(//draw menuBttn);  

它会破坏功能并导致错误。