2017-12-05 11 views
1

スーパークラスコンストラクタに可変引数を渡すのに最適な方法は何ですか?バックグラウンドは私が解決しようとしている問題を説明しています。Javascriptスーパークラスコンストラクタへの可変引数の受け渡し

私はJavaからJavaScriptにいくつかのコードを移植してい

背景。 Javaが持つコーディングパターンの1つに、関数のオーバーロードがあります。 Javaは、どの関数を呼び出すかを決定するために最良の一致を選択します。これは、関数がクラスコンストラクターメソッドである場合に面白くなります。

だから、JavaでコードをJavaScriptで

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

かもしれませんが、次のようになります。

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]); 
     } 
    } 
} 

だから私はこのケースを処理するための最良の方法は何か不思議でしたか?

解決策

注:)(スーパーの呼び出しは、コンストラクタでは、特殊なケースであり、あなたは一度だけ、それを呼び出すことができますので、私はこれを聞いていますのよ。だから私はこれがうまくいくとは思っていませんでしたが、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を見つけました。私はこれらの質問や投稿を見つけました:

しかし、私の質問に答えてください。

...可変引数をスーパークラスコンストラクタに渡すのに最適な方法は何ですか?argumentsを使用して

+2

https://stackoverflow.com/questions/38447168/es6-class-super-with-variadic-arguments参照されたNodeバージョンではサポートされていませんか? –

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super –

答えて

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

あなたではなく、残り/拡散演算子を使用することができるように推奨されていません。

+0

短くて甘い!ありがとうございました。この構文をサポートするには、どのバージョンのJavascriptが必要ですか?私はそれがES6だと思います。 http://es6-features.org/#RestParameterを参照してください。 ES5には良い答えがありますか? – PatS

+1

@PatS ES5にはクラスはありません... –

関連する問題