スーパークラスコンストラクタに可変引数を渡すのに最適な方法は何ですか?バックグラウンドは私が解決しようとしている問題を説明しています。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を見つけました。私はこれらの質問や投稿を見つけました:
- Passing all arguments forward to another javascript function @ BobStein-VisiBoneに感謝します。このBobStein-VisiBoneは、次の質問とは多少異なるため、この質問を再開することを提案しました。彼はまた提案しましたsearching on javascript pass all callers arguments to inner function
- Passing an array as a function parameter 引数は配列ではなく、内部関数に引数を渡すために使用することはできません。 Understanding what arguments object really is
- 一部の投稿ではapply()を使用していましたが、super.apply(this、arguments)を使用している人はいませんでした。これが最善の方法である場合は、これを答えとして提案してください。しかし、super()が呼び出されるまで、 "this"は設定されていないことがわかります。面白い...
- 私が試したのはJSFiddleです。ログメッセージを表示するには、ブラウザコンソールを開く必要があります。申し訳ありませんが使用するのが簡単です。
しかし、私の質問に答えてください。
...可変引数をスーパークラスコンストラクタに渡すのに最適な方法は何ですか?arguments
を使用して
https://stackoverflow.com/questions/38447168/es6-class-super-with-variadic-arguments参照されたNodeバージョンではサポートされていませんか? –
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super –