构造函数应通过解构赋值+默认参数实现轻量配置合并,复杂默认值移至static defaultProps并用展开运算符合并,嵌套配置需deepMerge,最后补充校验与类型归一化。

构造函数合并默认配置与用户参数,关键是让调用简洁、默认值可控、部分传参也能正常工作。核心不靠手写循环,而是用语言原生能力做安全、可维护的合并。
用解构赋值 + 默认参数直接初始化
这是最轻量也最推荐的起步方式。把整个配置对象解构成构造函数参数,每个字段自带默认值,空对象也安全。
- 语法上:在参数列表里写
{ label = '确定', size = 'small', disabled = false } = {} - 调用自由:
new Button({ label: '删除', disabled: true }),其余自动补全 -
= {}防止传入undefined导致解构失败
复杂默认值抽到 static defaultProps 中
当默认值不是简单类型(比如是函数、嵌套对象、需复用的配置),硬写在解构里会难读、难测、难复用。这时建议统一管理。
- 定义静态属性:
static defaultProps = { onClose: () => {}, zIndex: 1000, theme: { mode: 'light' } } - 合并时用
Object.assign({}, this.constructor.defaultProps, options)或展开运算符{ ...this.constructor.defaultProps, ...options } - 避免直接修改
defaultProps,保持其只读性
需要深合并时用 deepMerge 替代 Object.assign
Object.assign 和展开运算符都只做浅合并。如果用户传了 { headers: { token: 'abc' } },它会整个替换默认的 headers 对象,而不是只覆盖其中的 token 字段。
- 遇到嵌套配置(如
api.headers、ui.theme.colors)且需逐层覆盖时,用deepMerge类库 - 常见实现:Lodash 的
_.merge(),或轻量方案如deepmergenpm 包 - 示例:
const config = deepMerge(defaultConfig, userConfig)
加一层轻量校验与规范化
合并完不等于万事大吉。关键字段缺失或类型错,可能到运行时才暴露问题。
- 检查必填项:
if (!label) throw new Error('Button 必须提供 label') - 自动归一化:
disabled: userOptions.disabled ?? false,或把字符串'true'转布尔(按需) - 事件名统一处理,比如确保
onClick是函数,否则赋默认空函数











