在我的游戏中,我在 Main
中创建了一个 gameObjects
(其他类的实例,例如 Player)列表,我可以在其中循环并渲染它函数,而不是单独渲染它们。这是我的渲染函数;
this.gameObjects = [];
addObj(obj){
this.gameObjects.push(obj);
}
render(){
this.gameObjects.forEach(obj => obj.render());
}
如果我想使用这样的主类添加另一个 gameObject
,这没有问题;
let main = new Main();
let player = new Player(10, 30, 10, 10, 'red');
main.addObject(player);
main.start();
但是,我想在我的 Player
类中添加另一个名为 Projectile
的 gameObject
。问题是我的 Player
类无法访问 Main
的 addObj
函数。
我的想法是创建一个单例,它包含一个游戏对象列表,如下所示;
class Repository{
constructor(){
if(this.instance){
return this.instance;
}
this.list = [];
this.instance = this;
}
get obj(){...}
addObj(obj){...}
}
问题的要点是;
- 这是前进的最佳方式吗?
- 我如何访问这个单例?通过将其导入到我需要的任何地方?
- 使用实例创建全局变量?我该怎么做?
- 我是不是想多了?我应该将 main 传递给每个类并以这种方式访问其方法吗?
最佳答案
使用单例可能会使单元测试复杂化,并向应用程序的信息流添加隐藏状态。这并不是说该模式本质上有缺陷,而是使用该模式有正确和错误的方法,如果您不打算花时间并理解该模式,那么您最好不要使用它。您的 Singleton 计划将会起作用,只是它不是最强大的解决方案。
请注意,JS 是一种函数式语言。您不需要将 main 传递给每个类,只需传递 addObject 函数即可。这样,当您更改上下文时(例如在单元测试中或者您将回收其他项目的代码),您将能够仅切换传递的函数,并保留所有代码。
关于javascript - 从任何地方访问 Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57094177/