概要
サブクラスを定義する際に、継承元のクラスを完全に置き換えず、メソッドの変更をすることができます。
この場合は、サブクラスのコンストラクタやメソッドから、継承元のコンストラクタやメソッドを呼び出す方法があります。
次のようなサンプルコードを書いてみます。
(途中でconsoleログ出力して内容を出力しています)
//テスト用クラス function Mainclass() { Set.apply(this, arguments); } console.log(Mainclass.prototype); //Mainclassのプロトタイプにスーパークラスのプロトタイプを定義 Mainclass.prototype = Object.create(Set.prototype); //Mainclassを、そのMainclassのプロトタイプのコンストラクタに定義 Mainclass.prototype.constructor = Mainclass; Mainclass.prototype.add = function() { //引数argumentsを精査し、問題がなければスーパークラスのaddのみを追加 for (let i = 0; i < arguments.length; i++) { if (arguments[i] == null) { throw new Error("err"); } } return Set.prototype.add.apply(this, arguments); }; console.log(Mainclass.prototype);
出力結果は次のようになります(firefoxで確認した場合)
Object { … } Object { constructor: Mainclass(), add: add() }
最初の出力では空のオブジェクトなのに対し、
次の出力ではconstructorの定義と、addメソッドが定義されていることがわかります。
具体的にどのような動きになっているかをみてみると、
テスト用クラスMainclassに対し、Setのサブクラスを定義しています。
例として「Mainclassに対しnullのメンバーは定義できない」という制約がある場合、
addメソッドを定義する場合はnullをチェックする必要がでてきます。
そのような場合に
Mainclass.prototype.add = function() {
の行にあるメソッドで定義する引数argumentsをチェックし、チェック結果に
問題がない場合、スーパークラスのメソッドにチェーンします。