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 *가 리터럴을 할당하는 객체라고 기대하고 있다고 생각합니다. 이것은 틀린 것입니다. * this *는 실행 컨텍스트의 매개 변수이며 전역 코드에서는 전역 개체입니다. 어휘 적으로가 아니라 함수가 호출되는 방식 (또는 * bind *)에 따라 런타임시 설정됩니다 (화살표 함수는 제외하지만 여기서는 관련이 없습니다). – RobG

+0

@RobG 나는 힌트를 얻었습니다. 그런데 옵션이 없기 때문에 그 객체/상태의 다른 속성 사이에서 공유 될 수있는 하나의 객체/상태 *의 범위 안에 만 존재하는 변수를 선언 할 수있는 방법이 있습니까? – PixelProgrammer

+0

@ RobG, 잠깐, 당신이 'obj = {this.subobjc = {...}}'할 수 없다고 말하는거야? 100 % 유효하고 정확히 해당 컨텍스트에만 관련이있는 개체를 정의한다고 가정했기 때문입니다. 이 경우'menuState'는 전역 적으로 사용할 수 있지만'menuBttn'는 전역 적으로 사용할 수 없습니다. – frei

답변

0

나는 당신이 올바르게하고 있다고 생각합니다. 메뉴 단추는 만든 개체의 범위 내에 만 있으므로 다른 클래스는 menuState 안에 있으므로 menuBttn에 액세스 할 수 없습니다. 키워드를 사용하면 매우 똑똑합니다.

다른 옵션은 새 버튼을 만드는 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

첫 번째 예와 마찬가지로이 방법을 사용하십시오. 이렇게하면 "menuState.menuBttn"을 사용하거나 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