原型链继承不直接派生schema数据,而是解决属性查找与默认值复用;真正的数据派生需响应式监听或运行时计算。低代码引擎中可用其分层组织schema配置,实现默认规则透传与按需覆盖,提升可维护性。

原型链继承本身不直接“派生”schema数据,它解决的是属性查找与默认值复用问题;真正的数据派生(如根据上级字段动态生成下级选项)需靠响应式监听或运行时计算。但在低代码引擎中,可以将原型链作为schema配置的分层组织机制,让不同层级的默认规则自动向下透传、按需覆盖,从而支撑高效、可维护的 schema 衍生逻辑。
用 Object.create 构建干净的 schema 原型链
避免用构造函数或 new 创建默认配置,防止引用污染和 constructor 干扰。直接定义纯数据对象作为各层级原型:
- 基础层(globalDefaults):设所有组件通用字段,如
required: true、disabled: false、placeholder: '请输入' - 模块层(userFormDefaults):基于基础层创建,
Object.create(globalDefaults),再覆盖required: false、maxLength: 50 - 实例层(adminEmailField):基于模块层创建,
Object.create(userFormDefaults),仅设置label: '管理员邮箱'、type: 'email'
这样形成的查找路径是:adminEmailField → userFormDefaults → globalDefaults → null,读取未显式设置的字段时自动向上获取。
让 schema 层支持表达式与动态字段解耦
AMIS 类引擎常因表达式字段命名不统一(如 disabledOn vs disabled)导致 schema 难以分层管理。利用原型链可统一收口表达式解析逻辑:
- 在基础原型上定义
exprResolver方法(纯函数),统一处理*On、*Expr、插值字符串等格式 - 各层 schema 实例不重复实现,直接委托调用
this.exprResolver(value, dataScope) - 若某模块需特殊解析规则(如支持自定义函数名),只在该层原型覆盖
exprResolver即可,不影响其他层级
运行时动态更新默认行为,驱动 schema 衍生
因为是原型链查找而非深拷贝,修改某一层原型上的字段会实时影响所有未覆盖该字段的子实例:
- 灰度阶段临时关闭校验?改
globalDefaults.validate = null,所有未设 validate 的字段立即失效 - 某业务线要求所有输入框 placeholder 统一加前缀?改
globalDefaults.placeholder = '【新规范】请输入' - 模块级切换禁用状态逻辑?改
userFormDefaults.disabled = (data) => data.status === 'archived',所有继承它的字段自动获得该计算逻辑
这种能力不替代数据派生,但为派生提供稳定、可配置的上下文环境——比如联动加载时,source 字段的默认请求地址、参数映射规则,就可由原型链分层提供。
与真实数据派生逻辑协同工作
原型链管“静态结构与默认行为”,数据派生管“动态状态与计算结果”。二者应明确分工:
- schema 实例从原型链继承
apiUrl、paramsMapping、transformResponse等配置项 - 当用户选择上级字段时,组件内部触发
loadChildren(),该方法读取实例自身的value,再结合原型链上的apiUrl和paramsMapping拼接请求 - 返回数据后,由实例自己的
options字段接收(或通过响应式机制更新),原型链不参与此过程
这样既保持了 schema 的轻量与可继承性,又把运行时复杂度交给明确的生命周期方法,不混淆职责。











