2013-06-17 3 views
1

기본 Typescript 응용 프로그램이 있는데, 실제로 큰 문제는 발생하지 않아야합니다.하지만 여기에 뭔가 잘못되어있는 것 같아요.Typescript : private 멤버가 갑자기 정의되지 않았습니다.

이 개인 멤버 minUpdateRate은 내 GameContainer 클래스에 있으며 생성자에서 초기화됩니다. 이것은 이 호출 될 때 console.log() 메서드가 1을 출력하기 때문에 잘 진행되는 것 같습니다.

그러나, GameContainer.render() 메서드가 호출되면 범위를 벗어난 것으로 보입니다. 로그 메서드는 undefined을 출력합니다.

저는 TypeScript에 익숙하지 않고 JavaScript에 대해서도 깊이 생각하지 않습니다 (특히 스코프에 있어서는 혼란 스럽습니다 : /). 어떻게 그러나 이것을 해결할 수 있습니까?

Main 클래스 :

class TwoDGame extends Game { 
    public static main(context:CanvasRenderingContext2D) { 
     var game:Game = new TwoDGame(); 
     var container:GameContainer = new GameContainer(context, game); 

     container.start(); 

     return game; 
    } 
} 

게임 Container 클래스 :

class GameContainer { 
    ... 
    private minUpdateRate:number; 
    private game:Game; 
    private time:number; 
    ... 

    constructor(context:CanvasRenderingContext2D, game:Game) { 
     ... 
     this.minUpdateRate = 1; 
     this.game = game; 
    } 

    public start() { 
     ... 
     console.log(this.minUpdateRate); 
    } 

    public render() { 
     var now:number = new Date().getMilliseconds(); 
     var delta:number = now - this.time; 
     console.log(this.minUpdateRate); 

     if (delta > this.minUpdateRate) { 
      ... 
     } 
    } 
} 

스크립트 영역에 setInterval을 통해이라고 렌더 :

var game = TwoDGame.main(context); 

setInterval(game.getGameContainer().render, 16); 
+0

'game.getGameContainer()' –

+0

'getGameContainer'는'Game' 슈퍼 클래스에 정의되어 있습니다 – tBureck

+0

이 질문을보십시오 : https://typescript.codeplex.com/ discussion/445528. Stack Overflow에서 1000 번째 타이프 스크립트 질문에 대해 축하드립니다 :) – rob

답변

4

당신은 개체 컨텍스트 때를 잃고 당신은 setInterval()을 "렌더링"방법에 대한 참조로 전달합니다.

setInterval(function() { game.getGameContainer().render(); }, 16); 

함수와 속성 값을 통해 참조하는 개체 간의 본질적인 관계가 없습니다. 익명 함수를 사용하여 "컨테이너"개체가 "렌더링"내에 this 값이되도록 할 수 있습니다.

setInterval(game.getGameContainer().render.bind(game.getGameContainer()), 16); 

을하지만이 경우에는 약간의 추한 것 같다

또한 기능 프로토 타입의 .bind() 방법으로이 작업을 수행 할 수 있습니다.