はてダのほうが気楽に使える。

2007年3月21日水曜日

Javascriptのクラス定義


自前でクラス定義するときに考えるのはどんな機能をクラス化するかってことだと
思っている。個人的にXHR生成、cookie・URLの検証、ノードリストの取得が
コンストラクタでやってもらいたい処理だと思ってる。
Prototype.jsでClass.create();するってだけで90kbも読み込んで
こいつ自体の初期化に時間がかかるってオチは避けたい。

よし、発想の転換。Javascrptでなんか作りたいときはHTMLを完全に読み込んでonload時に
XHRでPrototype.jsを読み込んで、そこから本来の初期化をすることにしよう。
こうすることでユーザ側の回線が細くても初期の読み込み時間は非常に短くてすむ。
早い回線のときはいいとして、遅い回線相手にはかなり有効な気がする。

読み込み完了のイベントを拾ってアプリが完全な状態かどうかを
数秒間でもユーザに提供できたらただユーザを待たせるだけよりもよっぽど親切だと思う。
いくらPrototype.js依存アプリでもHTMLだけで最低限のUIを提供するのは基本だと思うし
一般的に有効な策だと思う。

ひとことでいうとブートストラップ方式っていうこと。
じゃあブートストラップとしてふさわしい処理は考えてみる。
といってもここで複雑なことをやっては元も子もない。
思いついたのは以下の方法。



function getPrototype()
{
XHR = new XMLHttpRequest();
XHR.open("GET","./prototype.js",true);
XHR.send("");
}

function bootstrap()
{
if ((XHR.readyState == 4) && (XHR.status == 200)) {
var MyClass = Class.create();
MyClass.prototype =
{
initialize: function(argv)
{
this.type = argv[0] || "";
},
setInfo : function(info)
{
$("info").innerHTML = info;
}
}
}
}
setTimeout("bootstrap()", 1000);
window.onload=getPrototype;



bootstrapって言う関数名じゃなくて単純にinitのほうがいいのかな。
そして、getPrototypeのほうがbootstrapの言葉にあってる気がする。
とりあえず、気にしない。要するに本来の初期化を開始する時刻は
onload後のPrototype.jsを読み込んだ後(一秒と仮定)にしてみたって感じ。
書いてて思ったけどPrototype.jsの読み込みをonload時にしちゃいかんとも
思うけど、今回の文章自体思いつきなのでそこは実際に使うときでも直す。


ということで長いものに巻かれよう。Prototype.jsだ。
ページ読み込み時にこいつも同時に読み込むのが気に食わなかったが
bootstrap方式で挑戦だ。
どんな言語でもひとつくらいはフレームワークを扱えるほどでいたいしね。
というか、最近はこれくらい使えないでどうするみたいな感じな気がするから
むしろ遅いスタートなんだよな。