将JSON数据加载到JS类中

时间:2017-04-16 00:22:05

标签: javascript json class asynchronous

我对JavaScript应用程序使用模块化方法:FloorTile的子类型,它本身有很多子类型,但这些子类型在JSON文件中声明,而不是其他JavaScript类。 问题是:要在客户端加载JSON文件,我需要执行同步请求,这会损害性能,或者是异步请求,这显然不允许我将数据放在实例上。

class Floor extends Tile {
    constructor(name) {
        $.getJSON('./data/tiles/floors/' + name + '.json', (json) => {
            let data = json;

            super(data.token, data.fg_color, data.bg_color, false);

            this.name = data.name;
            this.hardness = data.hardness;
            this.hitpoints = data.hitpoints;
            this.max_speed = data.max_speed;
            this.see_through = data.see_through;
            this.visible = data.visible;
            this.indestructible = this.hardness == -1 ? true : false;
        });
    }
}

有没有办法让这个模型工作,还是我更好地使用JavaScript类来做所有事情?我非常喜欢这种JSON方法。

1 个答案:

答案 0 :(得分:0)

  

或异步,其中(显然)不允许我把数据放在上面   实例

我认为这是因为this内的$.getJSON()不是引用类,而是引用jQuery函数。 (尝试在函数中执行console.log(this)并查看它输出的内容。)

因此,您需要保留this的上下文。这是一种方式:

class Floor extends Tile {
    constructor(name) {
        let self = this;
        $.getJSON('./data/tiles/floors/' + name + '.json', (data) => {
            super(data.token, data.fg_color, data.bg_color, false);
            self.name = data.name;
            self.hardness = data.hardness;
            self.hitpoints = data.hitpoints;
            self.max_speed = data.max_speed;
            self.see_through = data.see_through;
            self.visible = data.visible;
            self.indestructible = self.hardness == -1 ? true : false;
        });
    }
} 

如果您坚持使用关键字this,也可以使用jQuery.proxy()