Javascript将变量参数传递给超类构造函数

时间:2017-12-05 17:43:13

标签: javascript

将变量参数传递给超类构造函数的最佳/推荐方法是什么?背景解释了我试图解决的问题。

背景

我将一些代码从Java移植到Javascript。 Java具有的编码模式之一是函数重载。 Java选择最佳匹配来确定要调用的函数。当函数是Class构造函数方法时,这会变得很有趣。

因此Java中的代码可能是

public class MyParser extends Parser {
    public int parse(String str) { super(str); ... } 
    public int parse(String str, int base) { super(str, base); ... }
}

在Javascript中变为:

class MyParser extends Parser {
    constructor(){
        super(arguments); // THIS DOES NOT WORK
        if (arguments.length === 1 && typeof arguments[0] === 'string'){
            constructor_1arg(arguments[0]);
        } else if (...){
            constructor_2args(arguments[0], arguments[1]);
        }
    }
}

所以我想知道处理这种情况的最佳方法是什么?

可能的解决方案

注意:我问这个是因为调用super()是构造函数中的一个特例,你只能调用一次。所以我没想到这会起作用,但确实如此(在NodeJS v8.2中)。

class MyParserTry2 extends Parser {
    constructor(){
        console.log('MyParser2 passed ' + arguments.length + ' args. ', arguments);
        if (arguments.length === 1 && typeof arguments[0] === 'string'){
            super(arguments[0]);
            this.constructor_1arg(arguments[0]);
        } else if (arguments.length === 2 && typeof arguments[0] === 'string'){
            super(arguments[0], arguments[1]);
            this.constructor_2args(arguments[0], arguments[1]);
        }
    }

    constructor_1arg(arg1){ }
    constructor_2args(arg1, arg2){ }
}

我认为必须在其他代码之前调用super(),但这可能来自另一种语言。 Javascript标准是否支持调用super(),如此代码段所示?

以前的答案/研究

我搜索了StackOverflow的答案,发现了几个类似的问题,但没有找到这个问题。我发现了这些问题或帖子:

然而,以上都没有回答我的问题。

那么......将变量参数传递给超类构造函数的最佳/推荐方法是什么?

1 个答案:

答案 0 :(得分:5)

class SomeClass extends SomeSuperClass {
 constructor(...args){ super(...args); }
}

不推荐使用arguments,因此您可以使用rest / spread运算符。