采用原型继承构建段落节点模型,实例仅存个性化字段,共性配置统一置于原型链;支持多级语义继承与运行时动态更新,默认值修改实时生效且不影响已覆盖字段的节点,兼顾轻量性、一致性与可维护性。

直接用原型继承构建段落节点模型,核心是让每个段落实例只存个性化字段(如文本内容、自定义样式),共性配置(如默认行高、对齐方式、缩进规则)统一放在原型链上——这样改一次默认值,所有未覆盖该字段的段落节点立刻响应,无需遍历重设或触发批量更新。
把通用段落属性设为原型对象
先定义一个纯净的默认段落配置对象,不带 constructor,不挂方法,纯数据字段。例如:
- lineHeight:默认 1.6
- textAlign:默认 'left'
- textIndent:默认 '2em'
- allowBreak:默认 true(是否允许断行)
- maxLines:默认 0(不限制)
然后用 Object.create(defaultParagraphConfig) 创建每个具体段落节点实例。实例自身只设置 text、id、customClass 等差异化字段,其余都自动从原型链获取。
支持多类型段落的层级继承
当段落存在语义层级时(如基础段落 → 引用段落 → 脚注段落),可逐级组织原型链:
- 基于基础配置创建 quoteProto,覆盖 textAlign: 'justify'、borderLeft: '4px solid #999'
- 再用 Object.create(quoteProto) 创建 footnoteProto,仅设 fontSize: '0.85em'、marginBottom: '0'
查找顺序为:实例 → footnoteProto → quoteProto → 基础配置。这样既能复用底层样式逻辑,又可在任意层级精准控制覆盖粒度,适配富文本中多样化的语义段落需求。
运行时动态更新段落默认行为
因为是原型链查找而非属性拷贝,修改原型上的值会实时影响所有未覆盖该字段的段落节点:
- 修改 defaultParagraphConfig.lineHeight = 1.8,所有没设自身 lineHeight 的段落,下次渲染时立即应用新值
- 已设 lineHeight: 2.0 的标题段落不受影响,保持独立性
这对主题切换(如深色模式下统一调高行高)、租户级排版策略下发等场景非常实用,无需重新构造节点树或触发全量 diff。
避免原型污染与序列化陷阱
关键细节必须守住:
- 原型对象只放不可变数据字段,不放方法或依赖 this 的逻辑,防止执行上下文错乱
- 用 Object.getOwnPropertyNames(paragraphNode) 可清晰区分哪些是节点自有属性(如 text、id),哪些来自原型
- 导出 JSON 时建议用 JSON.stringify(Object.assign({}, paragraphNode)),避免把原型属性误序列化
这种设计使段落节点轻量、可预测、易调试,也天然契合富文本编辑器对结构化文档模型的高一致性要求。










