如何解析可变参数函数的参数值?Time函数传参优化咨询
优化Time函数的参数传递方案
方案1:自动识别末尾的options参数
通过判断参数列表的最后一项是否为有效对象,自动将其识别为options,避免用户手动传入undefined占位。核心逻辑是先提取所有参数,再调整参数赋值规则:
function Time(year, month, day, hour, minutes, options) { const args = Array.from(arguments); let opts = {}; // 检查最后一个参数是否为非空对象,且参数数量未达到5个(year到minutes共5个时间参数) if (args.length > 0 && typeof args[args.length - 1] === 'object' && args[args.length - 1] !== null) { if (args.length <= 5) { opts = args.pop(); // 将最后一项作为options } else { opts = options || {}; } } // 重新分配时间参数 [year, month, day, hour, minutes] = args; // 挂载实例属性 this.year = year; this.month = month; this.day = day; this.hour = hour; this.minutes = minutes; this.options = opts; } // 使用示例 const instance1 = new Time(2024, 06, { fr: {}, es: {} }); // 仅传year、month和options const instance2 = new Time(2024, 06, 15, 10, { fr: {} }); // 传year、month、day、hour和options const instance3 = new Time(2024, 06, 15, 10, 30, { fr: {} }); // 传全量时间参数和options
方案2:改用单一配置对象参数
直接让用户传入包含所有字段的配置对象,既满足参数依赖规则,又大幅提升代码可读性,无需关心参数顺序:
function Time(config) { // 解构参数,默认options为空对象 const { year, month, day, hour, minutes, options = {} } = config; // 验证参数依赖规则 if (month !== undefined && year === undefined) { throw new Error('month必须在year已定义的情况下传入'); } if (day !== undefined && month === undefined) { throw new Error('day必须在month已定义的情况下传入'); } if (hour !== undefined && day === undefined) { throw new Error('hour必须在day已定义的情况下传入'); } if (minutes !== undefined && hour === undefined) { throw new Error('minutes必须在hour已定义的情况下传入'); } // 挂载实例属性 this.year = year; this.month = month; this.day = day; this.hour = hour; this.minutes = minutes; this.options = options; } // 使用示例 const instance = new Time({ year: 2024, month: 06, options: { fr: { /* ... */ }, es: { /* ... */ } } });
方案3:修复链式调用的options方法
你之前尝试的链式调用失效,大概率是因为Time函数未返回实例,或是options方法未返回this。调整如下:
function Time(year, month, day, hour, minutes) { // 初始化实例属性 this.year = year; this.month = month; this.day = day; this.hour = hour; this.minutes = minutes; this.options = {}; } // 给原型添加options方法,返回this以支持链式调用 Time.prototype.options = function(opts) { Object.assign(this.options, opts); return this; // 关键:返回实例本身,维持链式调用 }; // 使用示例(必须用new创建实例) const instance = new Time(2024, 01).options({ fr: { /* ... */ }, es: { /* ... */ } }); // 现在可正常访问实例的所有属性和方法 console.log(instance.year); // 2024 console.log(instance.options.fr); // 配置对象
内容的提问来源于stack exchange,提问作者user9011377
相关产品推荐
相关产品推荐

