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

如何自动传递参数至super()?解决JS类继承参数冗余问题

问题:如何让子类自动继承并传递父类的所有构造参数?

我定义了如下父类:

class Animal {
  constructor({name, color}) {
    // 对name和color执行相关操作
  }
}

随后有多个继承自Animal的子类,例如:

class Lion extends Animal {
  constructor({name, color, tailLength}) {
    super({name: name, color: color})
    // 对tailLength执行相关操作
  }
}

这段代码不符合DRY原则。例如,当我需要为Animal新增一个参数时:

class Animal {
  constructor({name, color, height}) {
    // 对name、color和height执行相关操作
  }
}

此时必须修改Lion的接口,若还有100个继承自Animal的类,需要逐一修改它们。请问是否有办法重写代码,让所有子类能隐式继承Animal的所有参数并自动传递给super()?


解决方案

有两种简洁的方式实现需求,完全遵循DRY原则:

方法一:直接传递完整配置对象给父类

子类构造函数接收整个配置对象,直接传给super(),只在子类中处理自身独有的属性:

class Animal {
  constructor({name, color, height}) {
    this.name = name;
    this.color = color;
    this.height = height;
    // 其他相关操作
  }
}

class Lion extends Animal {
  constructor(options) {
    super(options); // 直接传递整个配置对象给父类
    this.tailLength = options.tailLength; // 仅处理子类独有的属性
  }
}

这样父类新增任何参数时,子类无需修改构造函数,只需在实例化时传入对应参数即可,比如:

const simba = new Lion({
  name: 'Simba',
  color: 'golden',
  height: 1.2,
  tailLength: 0.8
});

方法二:使用剩余运算符分离父类与子类参数

如果想明确区分父类参数和子类独有的参数,可以用对象解构的剩余运算符:

class Lion extends Animal {
  constructor({tailLength, ...animalProps}) {
    super(animalProps); // 传递父类所需的所有参数
    this.tailLength = tailLength;
  }
}

这种方式下,父类新增的参数会自动被...animalProps捕获,子类构造函数无需做任何修改,同样满足需求。


内容的提问来源于stack exchange,提问作者Edgar Derby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:00:13