如何在javascript中扩展具有多个参数的类
我已经学会了使用这个表单,但仍然不知道如何通过一种可读的方式用许多参数扩展类A如何在javascript中扩展具有多个参数的类,javascript,es6-class,Javascript,Es6 Class,我已经学会了使用这个表单,但仍然不知道如何通过一种可读的方式用许多参数扩展类A class A{ constructor(p1,p2,p3){ this.p1=p1; this.p2=p2; this.p3=p3; } } class B extends A{ constructor(p1,p2,p3,p4,p5){ super(p1,p2,p3); this.p4=p4; this.p5=p5; } } 如果我的代码不是实现这一点的最佳
class A{
constructor(p1,p2,p3){
this.p1=p1;
this.p2=p2;
this.p3=p3;
}
}
class B extends A{
constructor(p1,p2,p3,p4,p5){
super(p1,p2,p3);
this.p4=p4;
this.p5=p5;
}
}
如果我的代码不是实现这一点的最佳方式,请告诉我如何实现这一点,谢谢
更多问题
@T.J.克劳德
我试图使用option对象来扩展类A,但它不起作用,我错过了什么
class A{
constructor(obj){
this.p1=obj.p1;
this.p2=obj.p2;
this.p3=obj.p3;
}
}
输出为p1:Unfind;p2:未查找;p5:5当您认为函数或构造函数的参数太多,并且很难保持其正确性时,常用的方法是使用一个选项对象,或者可能使用一个或两个参数和一个可选的选项对象 例如:
class A{
constructor(opt){
this.p1=opt.p1;
this.p2=opt.p2;
this.p3=opt.p3;
}
}
class B extends A{
constructor(opt){
super(opt.p1,opt.p2,opt.p3);
this.p4=opt.p4;
this.p5=opt.p5;
}
}
var instant=new B({p1:1,p2:2,p3:3,p4:4,p5:5});
console.log('p1:'+instant.p1);
console.log('p2:'+instant.p2);
console.log('p5:'+instant.p5);
constructor({p1, p2, p3, p4, p5}) {
super(p1, p2, p3);
// ...use p4 and p5 here...
}
您称之为传入对象:
constructor(options) {
super(options.p1, options.p2, options.p3);
// ...use options.p4 and options.p5 here...
}
如果愿意,可以在参数列表中使用分解,以获取选项对象属性的单个局部变量:
new B({p1: "x", p2: "y", /*...*/});
您甚至可以更新A
,使其也接受options对象而不是离散参数。例如:
class A{
constructor(opt){
this.p1=opt.p1;
this.p2=opt.p2;
this.p3=opt.p3;
}
}
class B extends A{
constructor(opt){
super(opt.p1,opt.p2,opt.p3);
this.p4=opt.p4;
this.p5=opt.p5;
}
}
var instant=new B({p1:1,p2:2,p3:3,p4:4,p5:5});
console.log('p1:'+instant.p1);
console.log('p2:'+instant.p2);
console.log('p5:'+instant.p5);
constructor({p1, p2, p3, p4, p5}) {
super(p1, p2, p3);
// ...use p4 and p5 here...
}
假设您的子类
B
在末尾添加了它所需的属性,并且第一个属性将始终用于A
,则您可以使用每个函数接收的:
A类{
建造师(p1、p2、p3){
这是p1=p1;
这是p2=p2;
这是p3=p3;
}
}
B类扩展了A类{
构造器(p1、p2、p3、p4、p5){
超级(…参数);
//^^^分散参数以调用超级构造函数
这个。p4=p4;
这个。p5=p5
}
}
const实例=新的B(“一”、“二”、“三”、“四”、“五”);
log(“instance.p1:”,instance.p1);
log(“instance.p2:,instance.p2”);
log(“instance.p3:,instance.p3”);
log(“instance.p4:,instance.p4”);
log(“instance.p5:”,instance.p5)
您可以在构造函数中将您的obj
与this
合并,方法如下
class A {
constructor({p1, p2, p3}) {
// ...use p1, p2, and p3 here...
}
}
class B extends A {
constructor({p1, p2, p3, p4, p5}) {
super({p1, p2, p3});
// ...use p4 and p5 here...
}
}
必须有一个Dupitarget,但我找不到它…:-|为了进一步说明,我的目的是使用像{p1:'1',p2:'2',…,p5:'5}这样的对象作为按类新建对象的参数B@T.J.Crowder我找不到使用spread调用函数的好的副本。你说得对,我们应该有一些,但我主要是找到对象扩散、数组复制之类的。@T.J.Crowder什么是dupitarget?我做了一个谷歌,能够理解这是一些琐碎的语法问题。因此,DupiTaGet?@UtsavPatel-一个“DupiTaGet”是一个已经在网站上出现的问题,它的答案回答了这个问题。但是现在你无法控制该对象的字段。可能消费者提供了
p1
可能他们没有。所以,也许你现在有了那份财产,也许没有。这还可以添加您在一开始就不需要的属性,例如添加到字符串
。这可能是我最容易理解的解决方案,谢谢!