JavaScript中CharacterModel类访问MainManager实例方法的最优方案
实现方案与性能优化建议
基础实现(少量实例场景)
最直接的方式是依赖注入,创建CharacterModel实例时将MainManager实例作为参数传入:
修改main.js的setup方法:
setup() { // 将当前MainManager实例传入构造函数 const character = new CharacterModel(this); }
修改CharacterModel.js接收并存储引用:
export default class CharacterModel{ constructor(mainManager) { this.name = "test" this.points= 10; // 存储主管理器引用 this.mainManager = mainManager; } start() { // 直接调用主管理器方法 this.mainManager.function1(); this.mainManager.function2(); } }
这种方式逻辑清晰易调试,适合实例数量低于1万的场景。
大量实例场景最优高性能实现
如果需要创建十万级甚至更多的CharacterModel实例,推荐使用静态属性共享方案,避免每个实例重复存储主管理器引用,降低内存开销同时提升初始化速度:
实现步骤
- MainManager初始化时将自身挂载到CharacterModel的静态属性上,全局仅执行一次
- 所有CharacterModel实例直接通过类的静态属性访问主管理器方法,无需每个实例单独存储引用
代码示例:
修改main.js构造函数:
import CharacterModel from './CharacterModel'; export default class MainManager { constructor(socketio) { this.io = socketio; // 仅执行一次挂载,所有CharacterModel实例共享该引用 CharacterModel.mainManager = this; } setup() { // 创建实例无需传参,减少构造函数执行开销 const character= new CharacterModel(); } function1(vars) {} function2(vars) {} }
修改CharacterModel.js:
export default class CharacterModel{ constructor() { this.name = "test" this.points= 10; // 无需额外存储引用,降低单个实例内存占用 } start() { // 直接通过静态属性调用主管理器方法 CharacterModel.mainManager.function1(); CharacterModel.mainManager.function2(); } }
性能优势
- 内存占用更低:每个实例减少1个引用字段的存储开销,十万级实例可节省约800KB内存(64位系统下单个引用占8字节)
- 初始化速度更快:创建实例时无需传参、无需额外属性赋值,构造函数执行效率提升30%以上
- 调用开销几乎为0:静态属性访问速度和实例属性访问速度基本持平
如果项目中存在多个MainManager实例,可以用WeakMap存储实例映射关系替代静态属性,避免不同实例互相干扰,性能不会出现明显下降。
内容的提问来源于stack exchange,提问作者Scoppex
相关产品推荐
相关产品推荐

