コンストラクタチェーン

javascript

概要

サブクラスを定義する際に、継承元のクラスを完全に置き換えず、メソッドの変更をすることができます。

この場合は、サブクラスのコンストラクタやメソッドから、継承元のコンストラクタやメソッドを呼び出す方法があります。

次のようなサンプルコードを書いてみます。
(途中で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をチェックし、チェック結果に
問題がない場合、スーパークラスのメソッドにチェーンします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です