javascript - 从任何地方访问 Singleton
问题描述
在我的游戏中,我创建了一个列表gameObjects
(其他类的实例,例如 Player)Main
,我可以循环并在一个函数中渲染,而不是单独渲染它们。这是我的渲染功能;
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
addObj
我的想法是创建一个单例,它包含一个游戏对象列表,如下所示;
class Repository{
constructor(){
if(this.instance){
return this.instance;
}
this.list = [];
this.instance = this;
}
get obj(){...}
addObj(obj){...}
}
问题的 tl:dr 是;
- 这是前进的最佳方式吗?
- 我将如何访问这个单例?通过在我需要的任何地方导入它?
- 用实例创建一个全局变量?我该怎么做?
- 我是不是想太多了?我应该只将 main 传递给每个类并以这种方式访问它的方法吗?
解决方案
使用单例可能会使单元测试复杂化,并为应用程序的信息流添加隐藏状态。并不是说该模式天生就有缺陷,而是使用该模式有对错之分,如果您不打算花时间了解该模式,最好不要使用它。您的 Singleton 计划会奏效,但它不是最强大的解决方案。
请注意,JS 是一种函数式语言。您不需要将 main 传递给每个类,只需传递 addObject 函数即可。这样,当您更改上下文时(例如在单元测试中或如果您将回收其他项目的代码),您将能够切换传递的函数,并保留所有代码。
推荐阅读
- javascript - 条件语句为空或不为空
- wix - 需要帮助使用 wix 和 nant 命令行创建 msi 文件
- odata - $apply 在 OData v4 Northwind API 中不起作用
- linux - Azure 不支持将 Linux VM 内核从 AWS 迁移到 Azure
- javascript - WebPack Only: Invariant Violation: ReactKonva 目前不支持文本组件。你的文字是:“”
- python - 如何解析多个文本文件并将所需的输出附加到单个文件中。(用于文档)
- python - 在python中读取多个json
- python - Plotly 袖扣钥匙
- osmnx - OSMnx SSLError: HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443):
- scala - 从pyspark中的文本文件中删除第一行和最后一行