Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中扩展具有多个参数的类_Javascript_Es6 Class - Fatal编程技术网

如何在javascript中扩展具有多个参数的类

如何在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; } } 如果我的代码不是实现这一点的最佳

我已经学会了使用这个表单,但仍然不知道如何通过一种可读的方式用许多参数扩展类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;
 }
}
如果我的代码不是实现这一点的最佳方式,请告诉我如何实现这一点,谢谢

更多问题

@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
可能他们没有。所以,也许你现在有了那份财产,也许没有。这还可以添加您在一开始就不需要的属性,例如添加
到字符串
。这可能是我最容易理解的解决方案,谢谢!