JavaScriptの多重継承とオーバライド - JavaScriptの個人的なメモ (その2)
JavaScriptで多重継承
前回のメモでは、JavaScriptにおける多重継承のやり方を書いておきました。これを見て、メソッドのオーバライドのやり方が気になった人もいるかもしれません。
前回のメモ - JavaScrpitの個人的なメモ
http://d.hatena.ne.jp/dhrname/20121002
そこで、今回は、前回に続けて、メソッドのオーバライドのやり方を説明します。
前回と同様に、JavaScript以外の言語を習得している人を念頭においています。
メソッドのオーバライド
まず、Super1とSuper2の2つのコンストラクタ関数を用意します。
それらをChild関数に継承させます。このChild関数には、親と同じ名前のメソッドが登録されています。このメソッドに親のメソッドをオーバライドさせてみましょう。さらに親のメソッドも呼び出します。これはクロージャを使えば、かんたんに実現できます。
var Super1 = function(){ var that = this, a; /*プライベート変数として使う*/ that.setA = function(n) { a = n; }; that.getA = function() { return a; }; that.hoge = function() { return that.getA(); }; }, Super2 = function(){ var that = this, b; that.hoge = function(){ b = 20; }; that.getB = function() { return b; }; }, Child = function() { var that = this, superHoge, superHoge2; /*親メソッドにアクセスするためのプライベート変数*/ /*多重継承を始める*/ Super1.apply(that, arguments); superHoge = that.hoge; /*このときはSuper1::hoge*/ Super2.apply(that, arguments); superHoge2 = that.hoge; /*このときはSuper2::hoge*/ that.hoge = function() { var a = superHoge(); /*Super1のhogeメソッドを呼び出す*/ superHoge2(); /*Super2のhogeメソッドを呼び出す*/ return ( a + that.getB()); }; }; var obj = new Child(); obj.setA(2); obj.hoge(); /*22を返す*/
ただし、あなたが親のメソッドを使う気がないのでしたら、以下のようにChild関数はもっと単純に書くことができます。
Child = function() { var that = this; /*多重継承を始める*/ Super1.apply(that, arguments); Super2.apply(that, arguments); that.hoge = function() { return 12; }; }; var obj = new Child(); obj.setA(1); obj.hoge(); /*12を返す*/
結論
- JavaScriptでは、メソッドのオーバライドは、代入だけでOK
- メソッドが上書きされてしまうので、親のメソッド参照引渡しが必要となります (だから、that = thisで回避)