如何更简洁地在类构造函数中使用命名可选参数?
优化类构造函数的属性赋值方案
针对你遇到的重复编写this.variable_name = arg_name的问题,这里有几种优雅的实现方式,满足「新增类属性只需一行代码、参数名与类属性名一致」的需求:
方案一:Object.assign 合并默认参数对象
这种方式最简洁,新增属性时只需要在默认配置对象里添加一行即可,完全避免重复赋值:
class Planet { constructor(name, options = {}) { // 定义所有可选属性的默认值,用户传入的options会覆盖对应项 const defaultOptions = { mass: 100000, surface_temperature: 0.0, has_water: false }; // 合并默认配置与用户传入的配置 const finalOptions = { ...defaultOptions, ...options }; this.name = name; // 把合并后的属性直接挂载到实例 Object.assign(this, finalOptions); } }
比如要新增radius属性,只需要在defaultOptions里加一行radius: 5000,无需修改其他代码。
方案二:类字段 + 解构赋值(ES2022+)
如果你的运行环境支持ES2022类字段语法,可以提前声明类属性的默认值,再通过解构赋值覆盖用户传入的选项,结构更直观:
class Planet { // 提前声明类属性及默认值 name; mass = 100000; surface_temperature = 0.0; has_water = false; constructor(name, options = {}) { this.name = name; // 解构时直接赋值给实例属性,覆盖默认值 ({ mass: this.mass, surface_temperature: this.surface_temperature, has_water: this.has_water } = options); } }
新增属性时,只需在类字段里加一行(比如radius = 5000),再在解构语句里对应添加radius: this.radius即可。
方案三:解构时直接赋值到实例
这种写法省去中间变量,直接在解构过程中完成赋值,适合追求精简的场景:
class Planet { constructor(name, { mass = 100000, surface_temperature = 0.0, has_water = false } = {}) { this.name = name; // 解构时直接把参数赋值给实例属性 ({ mass: this.mass, surface_temperature: this.surface_temperature, has_water: this.has_water } = { mass, surface_temperature, has_water }); } }
以上方案中,方案一的扩展性最强,完全符合你「新增属性只需一行代码」的要求,推荐优先使用。
内容的提问来源于stack exchange,提问作者Existn't
相关产品推荐
相关产品推荐

