从任何地方访问Singleton

时间:2019-07-18 12:12:13

标签: javascript class singleton es6-class

在我的游戏中,我在gameObjects中创建了Main(其他类的实例,例如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();

但是,我想在我的gameObject类中添加另一个Projectile,称为Player。问题是我的Player类无法访问Main的{​​{1}}函数。

我的想法是创建一个单例,其中包含一个游戏对象列表,像这样;

addObj

问题的tl:dr是;

  • 这是前进的最佳方式吗?
  • 我将如何访问此单例?通过将其导入到我需要的地方?
  • 使用实例创建全局变量?我该怎么办?
  • 我是否在考虑这个问题?我应该只将main传递给每个类并以这种方式访问​​其方法吗?

1 个答案:

答案 0 :(得分:1)

使用单例可能会使单元测试复杂化,并向应用程序的信息流添加隐藏状态。并不是说该模式本质上是有缺陷的,但是使用这种模式有对与错的方式,如果您不想花时间去理解该模式,那么最好不使用它。您的Singleton计划会奏效,但这不是最可靠的解决方案。

请注意,JS是一种功能语言。您不需要将main传递给每个类,只需传递addObject函数即可。这样,当您更改上下文时(例如在单元测试中,或者如果您要回收其他项目的代码),您将能够只切换传递的函数,并保留所有代码。