JavaScriptのクラスの継承とオーバーライド

とりまソース。

スーパークラス::Super.js

var Super = function(num)
{
	this.test = "テスト";
	this.num = num;
	alert(num); //@1

	this.alert_num = function()
	{
		alert(this.num);
	}

	this.alert_num2 = function()
	{
		alert(this.num * 2);
	}
}

サブクラス::Sub.js

var Sub = function(num)
{
	this.num = num;

	//継承されたメンバメソッド
	this.alert_num2 = function()
	{
		alert("数字×2は" + (this.num * 2) + "です。");
	}

	//新たに追加されたメンバメソッド
	this.alert_num3 = function()
	{
		alert("数字×3は" + (this.num * 3) + "です。");
	}
}
Sub.prototype = new Super(); //@2

Subをnewすると@1のalertは実行されてしまう

@2で継承する時にスーパークラスをnewしている為?

「undefined」が表示される。
@2の部分を「Sub.prototype = new Super("hoge");」とすればhogeが表示される。

JavaScriptのコンストラクタはPHP等のそれとは意味合いそのものが違う?

var Hoge = function(hoge)
{
	this.hoge = hoge;
	alert(hoge);
	alert(this.hoge);
	
}

これはコンストラクタしか持たないClassという認識で合っているのか不安。
外部ファイルを読み込んだだけではalertされないし、newしたらきちんと2回alertされる。


var Hoge = function(hoge)
{
	this.hoge = hoge;
	alert(hoge);
	alert(this.hoge);

	this.myConstruct = function()
	{
		alert("コンストラクタメソッドが呼ばれました。");
	}

	this.myConstruct(); //@3
}

こう書くとnewした時点でthis.myConstruct()が呼ばれ、PHPのコンストラクタっぽく動作させることができる。
つまりメンバメソッド以外の部分はすべてnewの時点で実行される?
それがコンストラクタ?


まとめ

コンストラクタでメンバ変数に初期値設定するのはいいけれど、その初期値をnew時の引数から設定するのは継承時にソースの見通しが悪くなるから止めた方がいいのかと思ったり。
兎に角@3みたいな書き方は止めておこう。
やるにしてもo_hoge.initialize();という風に明示的に呼び出し、そのメンバメソッド内で設定させる方が無難かも。
継承そのものは出来ているし動作もしているんだけど、どういう書き方がナウいか全然分からない/(^o^)\

以下、改善してみたソース。
new後、set_num()メソッドを叩いて値を設定。



スーパークラス::Super.js

var Super = function()
{
	this.num	= null;

	this.set_num = function(num)
	{
		this.num = num;
	}

	this.alert_num = function()
	{
		alert(this.num);
	}

	this.alert_num2 = function()
	{
		alert(this.num * 2);
	}
}

サブクラス::Sub.js

var Sub = function(num)
{
	this.set_num = function(num)
	{
		this.num = num;
	}

	//継承されたメンバメソッド
	this.alert_num2 = function()
	{
		alert("数字×2は" + (this.num * 2) + "です。");
	}

	//新たに追加されたメンバメソッド
	this.alert_num3 = function()
	{
		alert("数字×3は" + (this.num * 3) + "です。");
	}
}
Sub.prototype = new Super();