如何避免函数调用重复长参数列表,实现参数仅在一处统一管理
解决方案
方案1:使用剩余参数+展开语法(改动最小)
仅需调整参数的接收和传递方式,不需要修改原有逻辑结构:
class Whatever { // 直接用剩余参数接收所有初始化参数 constructor(...initParams) { // 如果需要单独使用某个参数,也可以在这里解构:const [param1, param2, ...rest] = initParams this.someLongInitialTask1(...initParams) this.someLongInitialTask2(...initParams) // 其他初始化操作 } someLongInitialTask1(...params) { // 按顺序解构取出参数即可 const [param1, param2, /* ... */, param15] = params // 原有业务逻辑不变 } someLongInitialTask2(...params) { const [param1, param2, /* ... */, param15] = params // 原有业务逻辑不变 } }
- 优势:仅需要修改参数传递和接收的代码,原有业务逻辑不需要改动,后续新增/删除/调整参数时,只需要修改构造函数的入参规则,以及初始化方法内的解构规则即可,不需要修改调用时的传参代码。
方案2:构造函数内定义闭包方法(完全匹配需求)
因为两个初始化方法仅在构造阶段调用,完全可以直接定义在构造函数内部,直接共享构造函数的参数,连传参步骤都可以省略:
class Whatever { constructor(param1, param2, /* ... */, param15) { // 直接在构造函数内定义初始化方法,可直接访问所有入参,不需要额外传参 const someLongInitialTask1 = () => { // 这里直接用param1、param2...param15即可,不需要额外接收 // 原有业务逻辑不变 } const someLongInitialTask2 = () => { // 同上,直接用构造函数的入参即可 // 原有业务逻辑不变 } // 直接调用,不需要传参 someLongInitialTask1() someLongInitialTask2() // 其他初始化操作 } // 类上不需要再定义这两个初始化方法,不会挂载到实例或原型上 }
- 优势:完全不需要传递参数,两个初始化方法不会对外暴露,初始化完成后变量自动回收,也完全不会存储入参到实例属性,完美契合你的要求。
可选优化:用配置对象替代多参数传递
如果参数数量超过5个,更推荐用单个配置对象来传递所有参数,彻底避免参数顺序错误、漏传的问题:
class Whatever { constructor(initConfig) { // 解构出需要的参数,后续修改只需要调整这里的解构规则即可 const { param1, param2, /* ... */, param15 } = initConfig const someLongInitialTask1 = () => { // 直接用param1、param2等变量即可 } const someLongInitialTask2 = () => { // 同上 } someLongInitialTask1() someLongInitialTask2() } } // 调用时传对象,不需要记忆参数顺序 const instance = new Whatever({ param1: 'xxx', param2: 'yyy', // ...其他参数 param15: 'zzz' })
内容的提问来源于stack exchange,提问作者user8962168
相关产品推荐
相关产品推荐

