如何在JavaScript ECMA6中重载构造函数? 客观的

如何在JavaScript ECMA6中重载构造函数? 客观的,javascript,constructor,ecmascript-6,overloading,constructor-overloading,Javascript,Constructor,Ecmascript 6,Overloading,Constructor Overloading,在JavaScript ECMA6中实现一种允许构造函数重载的机制 为什么这不是复制品 主题虽然相似,但与本主题不同。另一个主题只关注使用旧版ECMAScript版本的构造函数重载,而本主题关注ECMA6。如果你正在寻找最新的答案,这里就是你想要的地方 背景 我有一个带有给定构造函数的JavaScript类,我希望用户在实例化对象时能够拥有不同的构造函数。下面是我假装的一个例子: const DEFAULT_WHEEL_NUMBER = 4; const DEFAULT_COLOR = "bla

在JavaScript ECMA6中实现一种允许构造函数重载的机制

为什么这不是复制品 主题虽然相似,但与本主题不同。另一个主题只关注使用旧版ECMAScript版本的构造函数重载,而本主题关注ECMA6。如果你正在寻找最新的答案,这里就是你想要的地方

背景 我有一个带有给定构造函数的JavaScript类,我希望用户在实例化对象时能够拥有不同的构造函数。下面是我假装的一个例子:

const DEFAULT_WHEEL_NUMBER = 4;
const DEFAULT_COLOR = "black";    
const DEFAULT_NAME = "myCar";

class Car{

    constructor(numberWheels, aName, aColor){
        this.wheelsNum = numberWheels;
        this.name = aName;
        this.color = aColor;
    }

    constructor(aName){
        this(DEFUALT_WHEEL_NUMBER, aName, DEFAULT_COLOR);
    }

    constructor(){
        this(DEFUALT_WHEEL_NUMBER, DEFAULT_NAME, DEFAULT_COLOR);
    }
}
在这段代码中,用户可以使用三个构造函数,每个构造函数接受不同数量的参数。使用示例如下:

var car1 = new Car(3, "tricicle-car", "white");
var car2 = new Car("Opel"); //creates black car with 4 wheels called Opel
var car3 = new Car(); //creates a black car, with 4 wheels called myCar
问题 如果使用Java或C#,这是一个简单的例子,因为这些语言都有构造函数重载

然而,从这一点上,我们可以得出这样的结论:JavaScript没有

问题:
  • 有没有一种方法可以使用ECMA6为JavaScript类实现类似的机制?如果不是,最佳/最接近的替代方案是什么

  • JavaScript中没有内置的解决方案。另一种解决方案是使用
    参数
    对象(在某些情况下),或传递您自己的配置选项,类似于以下内容:

    const defaults = {
        numberWheels: 4,
        color: "black",   
        name: "myCar"
    }
    
    class Car {
        constructor(options) {
             this.wheelsNum = options.numberWheels || defaults.numberWheels;
             this.name = options.name || defaults.name;
             this.color = options.color || defaults.color;
        }
    }
    
    这基本上是老派的解决方案,我在ES3中使用相同的逻辑。

    您是对的(据我所知),这不是JavaScript类支持的功能。鉴于您已经在使用ES6功能,我在此建议您改为使用:

    这显然附带了一个警告,即不能像在示例中那样使用具有不同参数顺序的“重载”(尽管在我看来,这是一件好事——使用一致的API更好)


    meskobalazs的答案也是一个很好的选择,特别是如果你有很多选择,你想让你的对象接受。通过函数参数这样做会有点混乱

    看看这个非常相似的问题:我认为最终的问题是Javascript不是Java,模仿Java习惯用法通常会带来很多麻烦。这只是我的观点。如果你真的认为超载是个好主意,这是一个很好的问题。您的示例高呼“Builder”。@zeroplagl:也许您可以用一个示例来提供一个答案?我是一个模式迷!看看打字脚本。它们使用类型化对象,如
    object:int
    而不是
    参数
    对象,您可以使用
    …restParameters
    ,它为您提供一个真实的数组。当使用
    |
    运算符时,您应该首先放置
    选项
    参数,否则您将始终获得默认对象。哇,true:)更新它,谢谢
    class Car {
        constructor(numberWheels = 4, aName = "myCar", aColor = "black"){
            this.wheelsNum = numberWheels;
            this.name = aName;
            this.color = aColor;
        }
    }