Class.createにsuperをつけてみた

prototype.jsは読み込まないけど、Class.create()構文が使いたい場合、以上のようなコードを書いてやれば使えるようになる。
今回は継承と$superを使えるようにしてみた。

// Class.createを可能にするための仕掛け
Class={create:function(proto,protoAppend){
	if (protoAppend) {
		proto.$super = proto.createrClass.prototype;
		for (var i in protoAppend) { proto[i] = protoAppend[i]; }
	}
	var klass = function () {
		if (this,arguments.length==1 && this,arguments[0] == "base_class") { return; }
		this.initialize && this.initialize.apply(this,arguments);
	};
	klass.prototype=proto;
	klass.prototype.createrClass = klass;
	return klass;
}};

// 親クラスを定義
Oya = Class.create({
	initialize: function(){WScript.echo('Oya init');},
	tes: function(){WScript.echo('Oya');}
});

// 子クラスを定義
Ko = Class.create(new Oya("base_class"), {
	initialize: function(){ WScript.echo('Ko init');},
	tes: function(){WScript.echo('Ko');}
});

// 孫クラスを定義
Mago = Class.create(new Ko("base_class"), {
	initialize: function(){ WScript.echo('Mago init');},
	tes: function(){WScript.echo('Mago');}
});

// 孫インスタンスから、superで子クラス、親クラスのメソッドを呼び出す
var mago = new Mago();
mago.tes();
mago.$super.tes();
mago.$super.$super.tes();



インスタンスから__proto__にあたるオブジェクトをどうやって取るか悩んだが、Class.prototype.createrClass = Class;としておけば、instance.createrClass.prototypeが__proto__に該当するものになると思いつくまで結構悩んだり。

2011-12-12追記。
注意、呼び出してるのはあくまでも親のprototypeオブジェクトのメソッドなので、関数内の「this」はprototypeオブジェクトを指す。
なので、親オブジェクトのメソッドを正常に呼び出したいのであれば以下のようにする必要がある。

mago.$super.$super.tes.call (mago, argv1, argv1, argv3);
mago.$super.$super.tes.apply(mago, arguments);