Javascriptのclassの実装について疑問があったので、コードを書いて検証した。
疑問点
- 属性と同名のgetterが書けるのか?
- 引数付きのgetterは書けるのか?
- 引数ありと引数なしの同名のmethodを書けるのか?
class Test {
constructor(val) {
this.attr1 = val; //---(1)
}
get attr1() {
return this.attr1;
}
get attr2(val) { //---(2)
return Number(val) * this.attr1;
}
func1() {
return this.attr1;
}
func1(val) { //---(3)
return this.attr1 / Number(val);
}
}
結果は、
属性と同名のgetterが書けるのか? →書けない
(1)のところでエラーとなる。
TypeError: Attempted to assign to readonly property.
なるほど、そう解釈しているんだ!引数付きのgetterは書けるのか? →書けない
(2)のところでエラーとなる。
[Error] SyntaxError: Unexpected identifier 'val'. getter functions must have no parameters.
書けると便利な場面があるんだけどな!引数ありと引数なしの同名のmethodを書けるのか? →書けるけど動きが違う
書くには書けるが期待した動作にならず。引数あり/なしのどちらで呼び出しても、(3)のメソッドが呼ばれる。つまり後勝ちってことだろう。
まとめ
上記はどれも、Javascriptには「型」の概念がない(まったく無い訳ではないが、ほぼほぼ無いに等しい)ことに起因していると考えると、どの結果も「なるほど、そっかー」の結果であった。実行時エラーとなってくれたらよいが、しれっと動くとバグに気付かず悩むことに・・・。
誤って同名のメソッドを定義してしまい、期待通りに動かずに悩んだ経験がある。同名関数は気を付けないと・・・。ドキュメントを書かずに直接コードを書いている時点でダメかも。