ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaScript-Typescript:私人成员突然未定义

2019-10-11 12:37:24  阅读:269  来源: 互联网

标签:javascript typescript setinterval this private-members


因此,我有一个基本的Typescript应用程序,它实际上不会引起任何重大问题,但看来这里出了点问题,我也不知道是什么.

我的GameContainer类中确实有此私有成员minUpdateRate,该类在构造函数中初始化.这样做似乎很顺利,因为调用GameContainer.start()时,console.log()方法将输出1.

但是,当调用GameContainer.render()方法时,似乎超出了范围之类,log方法在那里输出未定义的内容.

我对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);

解决方法:

当您通过setInterval()传递对“ render”方法的引用时,您将失去对象上下文.

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

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

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

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

但这在这种情况下似乎有点丑陋.

标签:javascript,typescript,setinterval,this,private-members
来源: https://codeday.me/bug/20191011/1892745.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有