JavaScript构造函数批量赋值对象属性如何实现更精简写法
JS构造函数同名属性批量赋值精简方案
逐行写this.xxx = product.xxx的重复代码可以用非常轻量的方式精简,完全不需要用getter那种反而增加代码量、还会带来序列化/性能副作用的方案。
推荐方案(无副作用、可控性强)
把所有需要拷贝的同名字段统一放到数组里,遍历批量赋值即可,后续增减字段只需要修改这个属性列表,不需要重复写赋值模板代码:
constructor(product) { this.session = SessionBuilder.create(); // 所有需要从product拷贝的同名属性统一列在这里 const copyKeys = ['id', 'name', 'root', 'pics', 'sizes', 'colors', 'rating', 'feedbacks']; copyKeys.forEach(key => { this[key] = product[key]; }); }
这个方案的优势:
- 不会引入额外的原型链开销,所有属性都是实例自有属性
- 不会出现JSON序列化丢失属性的问题,和原来逐行赋值的行为完全一致
- 可控性强,不会把product上多余的无关属性挂到实例上造成污染
- 代码量大幅减少,后续维护只需要维护属性列表即可
极简方案(仅适合无多余属性的场景)
如果你能确定传入的product对象上没有任何不需要挂载到实例的多余属性,可以用Object.assign一行完成批量拷贝:
constructor(product) { this.session = SessionBuilder.create(); Object.assign(this, product); }
注意:这个写法会把product的所有可枚举属性全拷贝到实例上,如果product后续新增了无关字段,会直接污染当前类的实例,业务代码里不推荐优先使用。
为什么不推荐getter方案
getter实现观感上统一,实际有不少隐性问题:
- 所有属性访问都要走原型链getter代理,相比直接挂载自有属性有额外性能开销
- 实例做JSON序列化时,原型上的getter属性默认不会被序列化,容易引发业务bug
- 如果后续需要修改实例上的对应属性,还要额外实现setter,反而进一步增加代码量
内容的提问来源于stack exchange,提问作者glmn
相关产品推荐
相关产品推荐

