Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript:私有成员突然未定义_Javascript_This_Typescript_Setinterval_Private Members - Fatal编程技术网

Javascript Typescript:私有成员突然未定义

Javascript Typescript:私有成员突然未定义,javascript,this,typescript,setinterval,private-members,Javascript,This,Typescript,Setinterval,Private Members,所以,我有一个基本的Typescript应用程序,它实际上不应该引起任何重大问题,但似乎这里出了问题,我不知道是什么 我在我的GameContainer类中有这个私有成员minUpdate,它在构造函数中初始化。这似乎进展顺利,因为当调用GameContainer.start()时,console.log()方法将打印出1 但是,当调用GameContainer.render()方法时,它似乎超出了范围或其他什么,log方法在那里输出undefined 我对TypeScript非常陌生,对Jav

所以,我有一个基本的Typescript应用程序,它实际上不应该引起任何重大问题,但似乎这里出了问题,我不知道是什么

我在我的
GameContainer
类中有这个私有成员
minUpdate
,它在构造函数中初始化。这似乎进展顺利,因为当调用
GameContainer.start()
时,
console.log()
方法将打印出
1

但是,当调用
GameContainer.render()
方法时,它似乎超出了范围或其他什么,log方法在那里输出
undefined

我对TypeScript非常陌生,对JavaScript也不太了解(尤其是涉及到作用域时,我会感到困惑:/)。但我如何才能解决这个问题

主要类别:

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;
    }
}
游戏容器类:

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调用Render:

var game = TwoDGame.main(context);

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

这样传递对“render”方法的引用时,将丢失对象上下文

setInterval(function() { game.getGameContainer().render(); }, 16);
函数和通过属性值引用它的对象之间没有内在关系。通过使用匿名函数,您可以确保“container”对象将是“render”中的
this
的值

您还可以使用函数原型的
.bind()
方法执行此操作:

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

但在这种情况下,这似乎有点难看。

我看不到在任何地方定义了此方法:
game.getGameContainer()
getGameContainer
是在
game
super类中定义的。看一下这个问题:。祝贺您就堆栈溢出问题提出第1000个typescript问题:)要更好地理解这一点,请使用typescript: