0

Название вопроса не может быть лучшим, но вот код, который я написал до сих пор:Как создать переменную, которая существует только в состоянии объекта?

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 (библиотека для создания игр), но я пытаюсь сделать свой собственный игровой движок ,

Как это сделать?

+0

Я не знаю о * phaser *, но в стандартном объектном литерале вы не можете определить имя свойства, используя 'this.menuBttn'. Я думаю, вы ожидаете, что это * будет объектом, которому вы назначаете литерал, что неверно. * this * является параметром контекста выполнения, в глобальном коде это глобальный объект. Он установлен во время выполнения, как функция вызывается (или * bind *), а не лексически (кроме функций стрелок, но они здесь неактуальны). – RobG

+0

@RobG У меня был намек на то, что будет так. Ну, так как это вне опции, у вас есть способ объявить переменную, которая существует только внутри области действия одного объекта/состояния *, но *, которые могут быть разделены между различными свойствами этого объекта/состояния? – PixelProgrammer

+0

@RobG, подождите, вы говорите, что вы не можете сделать obj = {this.subobjc = {...}} '? Потому что я уверен, что это 100% достоверно и точно, как вы должны определять объекты, которые имеют отношение только к этому контексту. В этом случае 'menuState' доступен во всем мире, но' menuBttn' не будет доступен по всему миру. – frei

ответ

0

Я думаю, вы делаете это правильно. Кнопка меню существует только в пределах области созданного вами объекта, поэтому другие классы не имеют доступа к menuBttn, так как она находится внутри menuState. Использование ключевого слова this очень умно.

Другой вариант - создать функцию make_button, которая создает новую кнопку, и создать ее внутри объекта menuState. Он совершает то же самое.

+0

Проблема, которую я заметил при использовании ключевого слова 'this', как у меня, это то, что в IDE отображается сообщение об ошибке«: expected ». Когда я запускаю код в браузере, он не показывает ту же ошибку, но мой код не работает. – PixelProgrammer

+0

Объект не имеет области действия, контексты выполнения. – RobG

+0

@PixelProgrammer Ошибка, о которой вы описали, состоит в том, что для назначения объекту переменной и значения вы не используете знак равенства, вы используете двоеточие. В части вашего поста, где вы говорите: «Я думал, что смогу сделать это, сделав:« измените знак равенства на двоеточие, и вы должны быть добрым. – Ribs

0

Возможно, вы ищете «шаблон модуля», который использует сразу вызываемое выражение функции (IIFE) и замыкания для создания «частных» членов, например.

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

Есть много статей по этому поводу, начать поиск. ;-)

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}; 
})(); 

Выполнение этого способа, как в первом примере. Это позволяет вам получить доступ к menuBttn, если вы используете «menuState.menuBttn» или хотите получить доступ к атрибутам menuBttn. Вы можете «menuState.menuBttn.x». Кроме того, вы не можете помещать комментарии одиночной строки в функцию.

surface.drawImage(//draw menuBttn); 

Это нарушает функцию и приведет к ошибке.

+0

Так я и планировал, но я столкнулся с некоторыми проблемами, которые вы можете увидеть здесь: http://stackoverflow.com/questions/41841512/why-cant-update-access-an-objects-img-properties ? noredirect = 1 # comment70868556_41841512 – PixelProgrammer

+0

Обновлен мой ответ. Последний код не работал должным образом. – Jonathon