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();