从任何地方访问单例

Access Singleton from anywhere

在我的游戏中,我在我的 Main 中创建了一个 gameObjects 列表(其他 classes 的实例,例如 Player),我可以在其中循环并渲染一个功能,而不是单独渲染它们。这是我的渲染函数;

this.gameObjects = [];

addObj(obj){
  this.gameObjects.push(obj);
}

render(){
  this.gameObjects.forEach(obj => obj.render());
}

如果我想像这样使用我的主 class 添加另一个 gameObject,这没问题;

let main = new Main();
let player = new Player(10, 30, 10, 10, 'red');

main.addObject(player);
main.start();

但是,我想在我的 Player class 中添加另一个 gameObject,称为 Projectile。问题是我的 Player class 无法访问 MainaddObj 函数。

我的想法是创建一个单例,其中包含一个游戏对象列表,如下所示;

class Repository{
  constructor(){
    if(this.instance){
      return this.instance;
    }
    
    this.list = [];
    this.instance = this;
  }
  
  get obj(){...}
  addObj(obj){...}
}

问题的tl:dr是;

使用单例可能会使单元测试复杂化,并向应用程序的信息流添加隐藏状态。并不是该模式天生就有缺陷,而是使用该模式有正确和错误的方法,如果您不打算花时间理解该模式,那么最好不要使用它。您的 Singleton 计划会奏效,只是它不是最可靠的解决方案。

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