如何避免在JavaScript类构造函数中逐一初始化成员属性
解决方案
- 方案1:直接使用
Object.assign快速赋值
无需额外封装,直接改写构造函数即可实现批量赋值,适合不需要做属性过滤的简单场景:
class User { name: string; email: string; password: string; // Partial<User>允许创建实例时只传部分属性,默认空对象避免不传参数时报错 constructor(values: Partial<User> = {}) { Object.assign(this, values); } } // 使用示例 const user = new User({ name: '张三', email: 'zhangsan@example.com', password: '123456' });
如果是纯JavaScript环境,去掉类型标注即可使用。
- 方案2:封装基类实现批量赋值+属性过滤
如果需要避免传入的参数包含不属于当前模型的额外字段、同时减少多模型的重复代码,可以封装通用基础模型类,所有数据库模型继承该基类即可:
class BaseModel { // 子类需要定义允许赋值的字段列表 static fields: string[] = []; constructor(values: Record<string, any> = {}) { const currentClass = this.constructor as typeof BaseModel; // 仅给提前定义的合法字段赋值 currentClass.fields.forEach(field => { if (values[field] !== undefined) { this[field as keyof this] = values[field]; } }); } } // 业务模型继承使用 class User extends BaseModel { static fields = ['name', 'email', 'password']; name: string; email: string; password: string; // 可以直接定义默认值,未传对应属性时会保留默认值 status: number = 0; } // 使用示例 const user = new User({ name: '张三', email: 'zhangsan@example.com', password: '123456', // 多余字段会被自动过滤,不会赋值到实例上 extraField: '非法参数' });
这种方案对于上百个属性的大模型非常友好,只需要在fields里列一次允许赋值的字段即可,不需要逐个写赋值语句。
内容的提问来源于stack exchange,提问作者Dr4kk0nnys
相关产品推荐
相关产品推荐

