JavaScript构造函数及可选参数

13

我现在正在学习JavaScript,我的背景是Java。在Java中,我们有重载构造函数,编译器会在编译时决定调用哪个版本的构造函数。

对于JavaScript来说,我们只能有一个构造函数。在这种情况下,如果构造函数有3个参数,如何只传递第三个参数。

例如:

class Addition {
 constructor(a,b,c){
   console.log(a+B+c);
 }
}

Addition obj = new Addition(null, 40, null);
//or
Addition onj2 = new Addition(undefined, undefined, 45);

有没有更好的方法在Javascript中实现这个?


1
JavaScript 中没有重载的概念。不过你仍然可以使用工厂模式。 - Vivick
1
我更喜欢使用构建器而不是三个构造函数,尤其是如果参数具有相同的类型。或者您可以像@Vivick建议的那样使用不同的工厂。重载并不是一个推荐的模式,因为它可能会导致猜测。 - a better oliver
3个回答

21
您可以使用EcmaScript的参数解构与默认值来实现这一点。此外,需要使用 const (或 let var )关键字创建变量。
class Addition {
  constructor({a = 0, b = 0, c = 0}) {
    console.log(a + b + c);
  }
}

const obj = new Addition({a: null, b: 40, c: null});
const onj2 = new Addition({c: 45});


1
constructor(a=null, b=null,c=null)constructor({a=null,b=null,c=null})有什么区别? - zilcuanu
3
使用前者时,你无法仅传递变量 c 的值,但使用后者可以。 - 31piy
JavaScript没有命名参数。OP的示例有三个参数,而你只有一个。它也不能解决根据参数数量选择不同函数(或任何代码片段)的问题。 - a better oliver
1
@abetteroliver -- 我重新表述了我的答案。我相信它解决了你评论中的第一个问题。我的答案基本上针对OP的这个陈述:_如何仅传递第三个参数_,因为在评论中已经指出JavaScript不支持函数重载。 - 31piy

2
在JS中没有超载的可能性,但是你可以使用对象解构(Object destructuring)。它们甚至可以是复杂的,并引用其他默认参数,例如:

function rangeMessage({from=1, to=from+1, message=(counter) => `Hello ${counter}`}={}) {
  for(from; from <= to; from++) {
    console.log(message(from));
  }
}

rangeMessage({from: 10, to: 20});
rangeMessage({to: 10, message:(counter) => `Bye ${counter}`})
rangeMessage()

function sumABC({a=null, b=null, c=null}={}) {
  let result = 0;
  if(a) result += a;
  if(b) result += b;
  if(c) result += c;
  return result;
}

console.log(sumABC());
console.log(sumABC({a:10}));
console.log(sumABC({b:5}));
console.log(sumABC({b: 10, c: 5}));

这段代码中的 {} = {} 部分与其他解构赋值语句相同 - 如果没有传入对象,则假定为空对象(然后由左侧的对象解构语句填充)。

1
我希望这解决了你的问题:D

class Addition {
 constructor(a=null,b=null,c=null){
   console.log(a+b+c);
 }
}

var obj = new Addition(null, 40, null);
var onj2 = new Addition(undefined, undefined, 45);


但是上面的情况不太好。我需要明确地提到 null 值,并且需要知道顺序。 - zilcuanu
@zilcuanu,你能表达一下你期望的输出是什么吗? - Akhil Aravind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接