2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScript: 奇抜なclass定義

2
Posted at

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名は?

以下の処理では何が表示されるのか? ABCデスカ? いやいやとんでもない、全て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のconstructorthis 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])
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?