javascript - 从任何地方访问 Singleton

标签 javascript class singleton es6-class

在我的游戏中,我在 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 类中添加另一个名为 ProjectilegameObject。问题是我的 Player 类无法访问 MainaddObj 函数。

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

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/

相关文章:

javascript - Express js错误404页面拦截带静态文件

Javascript 获取范围内每个工作日的 MM/DD 值?

javascript - 如何在主页标题中添加按钮链接,但与其他页面不同?

java - 将变量从 View 传递到 Activity

c++在类中创建对象

ios - Objective C - 单例静态方法覆盖不适用于多个子类

javascript - 如何使用 gulp-usemin 包字体

c# - 静态类库的替代品

c++ - Cocos2Dx中Singleton的正确实现方式

haskell - 如何解构 SNat(单例)