用于多个构造函数的 JavaScript 模式

2022-08-30 02:29:03

我的实例需要不同的构造函数。这有什么共同的模式呢?


答案 1

JavaScript没有函数重载,包括方法或构造函数。

如果希望函数根据传递给它的参数的数量和类型而具有不同的行为,则必须手动嗅探它们。JavaScript 会很乐意调用参数数多于或少于声明的参数数的函数。

function foo(a, b) {
    if (b===undefined) // parameter was omitted in call
        b= 'some default value';

    if (typeof(a)==='string')
        this._constructInSomeWay(a, b);
    else if (a instanceof MyType)
        this._constructInSomeOtherWay(a, b);
}

您还可以像数组一样进行访问,以获取传入的任何其他参数。arguments

如果您需要更复杂的参数,最好将它们中的部分或全部放在对象查找中:

function bar(argmap) {
    if ('optionalparam' in argmap)
        this._constructInSomeWay(argmap.param, argmap.optionalparam);
    ...
}

bar({param: 1, optionalparam: 2})

Python演示了如何使用默认和命名参数以比函数重载更实用和优雅的方式覆盖大多数用例。JavaScript,不是那么多。


答案 2

您可以将类与返回该类的实例的静态方法一起使用

    class MyClass {
        constructor(a,b,c,d){
            this.a = a
            this.b = b
            this.c = c
            this.d = d
        }
        static BAndCInstance(b,c){
            return new MyClass(null,b,c)
        }
        static BAndDInstance(b,d){
            return new MyClass(null,b, null,d)
        }
    }

    //new Instance just with a and other is nul this can
    //use for other params that are first in constructor
    const myclass=new MyClass(a)

    //an Instance that has b and c params
    const instanceWithBAndC = MyClass.BAndCInstance(b,c)

    //another example for b and d
    const instanceWithBAndD = MyClass.BAndDInstance(b,d)

使用此模式,您可以创建多构造函数