构造函数通过初始化阶段的类型校验与条件赋值实现属性过滤,即只保留合法类型字段;具体包括基础类型判断、安全转换、无效值过滤、自有属性筛选、构造前预过滤及运行时校验。

构造函数本身不直接提供属性过滤能力,但可以通过在初始化阶段做类型校验 + 条件赋值,实现“只保留合法类型字段”的效果。关键不是事后删属性,而是在创建实例时就控制哪些值能进、以什么形式进。
构造函数内做类型校验与默认降级
把原始数据传入构造函数后,立刻对每个字段执行类型判断和转换,不符合要求的就设为默认值或跳过:
-
用
typeof或Array.isArray()判断基础类型:比如要求name必须是字符串,非字符串就转空串或丢弃 -
对数字/布尔等做安全转换:用
Number(raw.age) || 0替代直接赋值,避免NaN进入实例 -
过滤掉 null / undefined / 空对象等无效值:例如
this.tags = Array.isArray(raw.tags) ? raw.tags : []
结合 hasOwnProperty 实现自有属性筛选(用于初始化后清理)
如果原始数据混杂了继承属性或意外挂载的字段,可在构造函数末尾加一步自有属性过滤:
- 遍历
raw对象,只取raw.hasOwnProperty(key)为true的键 - 再对这些自有键做类型校验,避免原型链上污染的数据被误用
- 示例:
Object.keys(raw).filter(k => raw.hasOwnProperty(k)).forEach(...)
用 Object.fromEntries + filter 实现“构造前预过滤”
更灵活的做法是:在调用构造函数前,先用对象过滤工具清洗原始数据:
- 写一个通用过滤函数,比如只保留字符串、数字、布尔类型的值
- 再把清洗后的对象传给构造函数:
new User(filterObject(raw, ([k, v]) => typeof v === 'string' || typeof v === 'number')) - 这样构造函数专注结构定义,校验和过滤逻辑解耦,复用性更高
配合原型方法做运行时校验(可选增强)
构造函数完成初始化后,还可添加实例方法,在后续操作中持续校验:
- 比如
user.validate()遍历this上的关键字段,检查类型是否仍合规 - 或
user.sanitize()自动修复异常值(如把age: '25'转成数字) - 这类方法不改变构造逻辑,但提升了模型的健壮性











