JavaScript类实例化时除构造函数外可在哪里调用DOM生成方法
实现方案
方案1:使用静态工厂方法(推荐)
该方案符合单一职责原则,构造函数仅负责实例属性初始化,渲染逻辑由专门的工厂方法统一触发,既能保证每次创建实例自动执行渲染,也避免了构造函数执行DOM操作这类副作用。
修改GroupBox类代码如下:
class GroupBox extends Box { constructor(groupOptions) { super({ name: groupOptions.name, type: groupOptions.type, logo: groupOptions.logo, }); this.subjectBoxes = []; this.name = groupOptions.name; this.type = groupOptions.type; this.logo = groupOptions.logo; this.gotoGroup = groupOptions.gotoGroup; this.container = groupOptions.container; this.subjects = groupOptions.subjects; this.subjectIcons = groupOptions.subjectIcons; // 移除构造函数内的createGroupBox调用 } // 新增静态工厂方法 static create(groupOptions) { const instance = new GroupBox(groupOptions); // 实例属性初始化完成后再调用渲染方法 instance.createGroupBox(); return instance; } // 原有createGroupBox方法保持不变 createGroupBox() { // 原有DOM生成、事件绑定、插入页面的逻辑不变 } }
后续在displayGroupBoxes函数中,把原本的new GroupBox(参数)替换为GroupBox.create(参数)即可,无需修改其他逻辑,就能保证每次生成实例自动执行渲染。
方案2:修改外层实例化逻辑(改动最小)
如果不想调整类的内部结构,直接修改displayGroupBoxes的遍历逻辑即可,每次实例化完成后立刻调用渲染方法:
// 原displayGroupBoxes函数逻辑 function displayGroupBoxes() { // 读取sessionStorage、获取分组数据的逻辑省略 groupData.forEach(item => { const group = new GroupBox(item); // 新增一行调用渲染方法 group.createGroupBox(); }) }
该方案无需修改类的内部代码,仅调整外层调用逻辑,改造成本最低。
方案对比
- 静态工厂方法优势:封装性更好,调用方不需要感知渲染逻辑的存在,只要调用
GroupBox.create就能得到完整可用的实例,避免后续维护时有人手动实例化后忘记调用渲染方法的问题 - 外层调用修改优势:改动量最小,不需要调整类的原有结构,适合临时快速迭代的场景
内容的提问来源于stack exchange,提问作者Mickey Vershbow
相关产品推荐
相关产品推荐

