我对JavaScript应用程序使用模块化方法:Floor
是Tile
的子类型,它本身有很多子类型,但这些子类型在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方法。
答案 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()。