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

如何更简洁地在类构造函数中使用命名可选参数?

优化类构造函数的属性赋值方案

针对你遇到的重复编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:42:25