JavaScript Library MKF
prototype.jsを先にscript要素で呼び出しておく必要があります。
JavaScriptでは継承がすっきりかけなくていやんだったので,
自分なりに作ってみました。
MKFを使うと継承はこんな感じです。
// スーパークラスの定義
var MySuperClass = Class.create(); // MKF.Class.create();でも可
MySuperClass.prototype = { /* ここにMySuperClassの定義を書く */ };
// サブクラスの定義
var MySubClass = MKF.Class.create();
MySubClass.extend(MySuperClass).implement({
initialize : function (arg) {
this._super(arg); // スーパークラスのコンストラクタ呼び出し
},
new_method1 : function () { /* サブクラスで新しくメソッドを定義 */ },
...
});
_superキーワードでスーパークラスのコンストラクタ呼び出しが出来るんで,
少しは気分良く継承が出来るかなぁと思っています。
そしてメソッドのオーバーライド。
普通にやろうとすると,スーパークラスのメソッドをサブクラスで上書きすることになるんですが,
そうするとスーパークラスのこのメソッドが呼び出せなくなります。
スーパークラスのオーバーライド対象となるメソッドを呼び出す前後に,
何かしら処理を加えたいとき,スーパークラスのが呼び出せなくていやんです。
なので,呼び出せるようにしてみました。
var MySuperClass2 = MKF.Class.create();
MySuperClass2.extend(MKF.Class.Overridable).implement({
initialize : function () { /* コンストラクタ */ },
calc : function (x, y) { return x + y; }
});
var MySubClass2 = MKF.Class.create();
MySubClass2.extend(MySuperClass2).implement({
initialize : function () { /* コンストラクタ */ },
// オーバーライドするメソッドをここで定義する
override : {
calc : function (x, y) {
x *= x;
y *= y;
return super_method(x, y); // MySuperClassのcalcを呼び出す
}
}
});
var foo = new MySuperClass2;
alert(foo.calc(2, 2)); // 4が表示される
var hoge = new MySubClass2;
alert(hoge.calc(2, 2)); // 8が表示される
スーパークラスのコンストラクタ呼び出しは"this._super"で"this"がついているのに,
スーパークラスのオーバーライドされた元々のメソッドの呼び出しは"this"がつかなくて
少々気持ち悪いですが。
こんなものを作ってみましたが,
JavaとJavaScriptを連携して動かす方法もあるようなので,
オブジェクト指向でしっかり書きたいところはJavaで書くべきなのかもしれませんね。
1 comment:
WebにJavaScript 2.0の時代が近づく
JavaScript2.0が出来るまでMKF使ってごにょごにょしようかとか思っています。
Post a Comment