You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:01:05