extends連打
class A extends class extends class{}{}{}
駄目な書き方
class A extends class{} extends class{}{}
extends連打(同名class付き)
class A extends class A extends class A{}{}{}
constructorの記述を誤ると死に至る
以下のclass A、class Bの定義自体に支障は無い。しかしinstance生成時に問題が起こる。お分かり頂けるだろうか?
class A extends class extends class{constructor(){}}{}{}
class B extends class extends class{}{}{constructor(){}}
以下の処理をするとnew Bの時点でerrorが発生する。
new A;new B
なぜかって? それをここに書くには余白が狭過ぎる。強いて言うなら…
Must call super constructor in derived class before accessing 'this' or returning from derived constructor
という事だ! 日本語に生翻訳すると…
派生classで「this」を参照したり、派生classのconstructorから戻る前に、必ず親classのconstructorを呼び出しやがれ
つまり継承しているのに、constructor内でsuper()を呼んでやがらない、JavaScriptのclassの基本原則に抵触しているのが原因である。class Bは以下のように修正すれば良いのだ。
class B extends class extends class {}{}{constructor(){super()}}
ちなみに、constructorを省略していれば、自動的にconstructor(...args){super(...args)}を補完してくれるためerrorにはならない。
class名は?
以下の処理では何が表示されるのか? A、B、Cデスカ? いやいやとんでもない、全てAと言わざるを得ませんぞ。常識でござるぞ。
class A extends class B extends class C{
constructor(){
console.log(this.constructor.name)
}
}{
constructor(){
super();console.log(this.constructor.name)
}
}{
constructor(){
super();console.log(this.constructor.name)
}
}
new A
JavaScriptでは親classのconstructorがthis objectを初期化する役割を担っている。と、いう事はそういう事だ。
property設定
やや変態的な設定術。aの中身は{0:0, 1:1, 2:2, 3:3}と言っても過言ではない。
class A extends class extends class{
[0]=0;
constructor(){
this[1]=1
}
}{[2]=2}{[3]=3}
let a=new A;
では重複させるとどうなるのか。以下の処理で何が表示されるかお分かりだろうか? 御自身でお確かめ下さいと言わざるを得ない
class A extends class extends class{[0]=0;constructor(){this[0]++}}{[0]=2}{[0]=4}
let a=new A;
console.log(a[0])