在Javascript中设置属性的默认值

在Javascript中设置属性的默认值,javascript,oop,default-value,Javascript,Oop,Default Value,如何设置类的属性p1、p2、p3和p4`的默认值: class O extends AnotherClass { constructor(p1,p2,p3,p4) { super(); \\ for the this-reference if (p1) this.p1 = p1; if (p2) this.p2 = p2; if (p3) this.p3 = p3; if (p4) this.p3 = p4; } 我必须一个接一个地写

如何设置类的属性
p1
p2
p3
和p4`的默认值:

class O extends AnotherClass {

    constructor(p1,p2,p3,p4) {
    super(); \\ for the this-reference
    if (p1) this.p1 = p1;
    if (p2) this.p2 = p2;
    if (p3) this.p3 = p3;
    if (p4) this.p3 = p4;

    }
我必须一个接一个地写吗

O.prototype.p1 = "default1"
O.prototype.p2 = "default2"
O.prototype.p3 = "default3"
O.prototype.p4 = "default4"
还是有更优雅的方式,比如

O.prototype = {p1: "default1", p2 : "default1", p3 : "default3", p4 : "default4"}

但是后者似乎不起作用…

当您在构造函数中声明参数时,您可以在es6中设置默认属性,如
构造函数(p1='默认变量',p2='默认变量',p3='默认变量',p4='默认变量')

当您在构造函数中声明如下参数时,您可以在es6中设置默认属性
构造函数(p1='默认变量',p2='默认变量',p3='默认变量',p4='默认变量')

除了普通的ES2015+默认参数值之外,@Fried_Chicken已经回答,还有另一种方法

为什么不接受参数作为对象,然后使用ES2015+解构功能?这是一个很好的选择,因为您可以按任意顺序提供整个参数,甚至只提供其中的一个或部分参数

此外,您不需要为某些给定参数提供
null
/
未定义的

doStuff(1, null, null, 2); 
请参阅下面的可运行代码片段并使用它。在您的场景中可以应用相同的解决方案,因为可以在类构造函数上使用解构

函数doStuff({arg0=null,arg1=null}={}){
如果(arg0!==null){
console.log(arg0);
}否则{
控制台日志(“未提供”);
}
}
doStuff();

doStuff({arg0:“你好,世界”})除了@Fried_Chicken已经回答的纯ES2015+默认参数值之外,还有一种替代方法

为什么不接受参数作为对象,然后使用ES2015+解构功能?这是一个很好的选择,因为您可以按任意顺序提供整个参数,甚至只提供其中的一个或部分参数

此外,您不需要为某些给定参数提供
null
/
未定义的

doStuff(1, null, null, 2); 
请参阅下面的可运行代码片段并使用它。在您的场景中可以应用相同的解决方案,因为可以在类构造函数上使用解构

函数doStuff({arg0=null,arg1=null}={}){
如果(arg0!==null){
console.log(arg0);
}否则{
控制台日志(“未提供”);
}
}
doStuff();

doStuff({arg0:“你好,世界”})
this.p1=p1 | |“一些默认值”
,等等为什么不将参数传递给
super()
?请注意,
if(p1)
将对未定义的值以外的值求值为false,例如null、0、false等。您最好进行一种类型的测试。
this.p1=p1 | |“一些默认值”
,etc为什么不将参数传递给
super()
?请注意
if(p1)
将对未定义的值以外的值求值为false,例如null、0、false等。您最好使用类型测试。哇,StackOverflow什么时候有可运行的代码段了?@MichaelHey,我不确定,但我相信那是一年多以前的事了!非常感谢。工作起来像个傻瓜,StackOverflow什么时候开始有可运行的代码段了?@MichaelHewson嘿,我不确定,但我相信那是一年多以前的事了!非常感谢。工作得很有魅力