【问题标题】:Typescript: private member is suddenly undefined打字稿:私人成员突然未定义
【发布时间】:2013-06-13 10:57:24
【问题描述】:

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

我的GameContainer 类中有这个私有成员minUpdateRate,它是在构造函数中初始化的。这似乎很顺利,因为当调用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 调用渲染:

var game = TwoDGame.main(context);

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

【问题讨论】:

标签: javascript this typescript setinterval private-members


【解决方案1】:

当您以这种方式传递 setInterval() 对“render”方法的引用时,您将丢失对象上下文。

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

函数和通过属性值引用它的对象之间没有内在关系。通过使用匿名函数,您可以确保“容器”对象将是“渲染”中this 的值。

您也可以使用 Function 原型的 .bind() 方法来做到这一点:

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

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

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2016-09-05
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多