如何自动传递参数至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
相关产品推荐
相关产品推荐

