ForestEXOR Games Blog

引退プログラマーは最新技術に着いて行けない

JavaScriptのclassとclassもどきのメモ

JavaScriptにおけるES6のclassで少し面倒な事が起きてES5のclass(functionを用いたclassっぽいもの)を使った方がスマートに解決できる気がするのでメモしておく。

class(CHoge)の中にclass(CFuga)
class CHoge{
	CFuga = class{
		constructor( num ){
			this.num = num;
		}
	}
	constructor(){
		this.fuga = new this.CFuga( 0 );
	}
}

これはOK。

class(CHoge)の中のclass(CPiyo)にclass(CHoge)の中のclass(CFuga)
class CHoge{
	CFuga = class{
		constructor( num ){
			this.num = num;
		}
	}
	CPiyo = class{
		constructor(){
			this.fuga = new this.CFuga( 0 );
		}
	}
	constructor(){
		this.fuga = new this.CFuga( 0 );
		this.piyo = new this.CPiyo();
	}
}

Uncaught TypeError: this.CFuga is not a constructor
そりゃそうだよね、CPiyoから見てCFugaは持ってないのでthis付けられても困るよね。

thisをはずしても

CPiyo = class{
	constructor(){
		this.fuga = new CFuga( 0 );
	}
}

Uncaught ReferenceError: CFuga is not defined
CPiyoから見てCFugaなんて知らねーよ。となる。

解決法

外に出す

class CFuga{
	constructor( num ){
		this.num = num;
	}
}
class CPiyo{
	constructor(){
		this.fuga = new CFuga( 0 );
	}
}
class CHoge{
	constructor(){
		this.fuga = new CFuga( 0 );
		this.piyo = new CPiyo();
	}
}

これが手っ取り早い、でもそのclass(CHoge)でしか使わないならその中に収めたい…

staticにする

class CHoge{
	static CFuga = class{
		constructor( num ){
			this.num = num;
		}
	}
	CPiyo = class{
		constructor(){
			this.fuga = new CHoge.CFuga( 0 );
		}
	}
	constructor(){
		this.fuga = new CHoge.CFuga( 0 );
		this.piyo = new this.CPiyo();
	}
}

なんか、気持ち悪い。

class CHoge{
	static CFuga = class{
		constructor( num ){
			this.num = num;
		}
	}
	static CPiyo = class{
		constructor(){
			this.fuga = new CHoge.CFuga( 0 );
		}
	}
	constructor(){
		this.fuga = new CHoge.CFuga( 0 );
		this.piyo = new CHoge.CPiyo();
	}
}

CPiyoもstaticにして揃えたとしても気持ち悪い。
これなら外に出した方がまだましな気がする。


この場合、CHogeはclassなんてやめてES5のclassもどきのfunctionにした方がいいのではなかろうか。

let Hoge = function(){
	class CFuga{
		constructor( num ){
			this.num = num;
		}
	}
	class CPiyo{
		constructor(){
			this.fuga = new CFuga( 0 );
		}
	}
	this.fuga = new CFuga( 0 );
	this.piyo = new CPiyo();
}

気持ちいい~

ゲームのタイトル画面とかはclassよりfunctionの方が作りやすいなという結論に至りました。