prototype.jsを使えるように2007年04月24日 03時46分36秒

きっかけ

prototype.jsが大好きだ。組み込みオブジェクトのprototypeを汚染拡張しているところが大好きだ。

なので、WSHでも使ってみたい。

※:以下の記述は、prototyp.js1.4.0ベースです。1.5系はどうかわかりません

困ったことに

prototype.jsを(Windowsで、ね。)ダブルクリックしてみると、さっそく「documentは宣言されていません」とか怒られるんですよ。

これ、当然といえば当然で、prototype.jsはブラウザホストで稼動させることが前提なので、windowやらdocumentやらlocationやらを参照してるからなのだけど、この辺のオブジェクトをダミー宣言してやれば、ClassだのEnumerableだのTryだのは使用できるんですよ。

ダミースクリプト

前のエントリの感じで以下のスクリプトを、prototype.jsよりも前にロードしておくことにする。仮に「dummy.js」とでもしておこう。

// prototype.jsのためのダミー宣言
var window = { Element : null }
var document = {
	getElementById : function() {},
	getElementsByName : function() {},
	getElementsByTagName : function() {},
	createElement : function() {},
	documentElement : null,
	body : null
}
var navigator = { userAgent : null }

んで、prototype.jsもロード

dummy.jsよりも後なら、prototype.jsのロードができるんですよ。以下のように。

with( {
	// ライブラリのパスリスト
	libs : [
		"dummy.js",
		"prototype.js"
	],
	// libs[]のインデックス
	index : 0,
	// ソース取得メソッド
	getSource : function(path) {
		var stream, fso = new ActiveXObject("Scripting.FileSystemObject");
		try {
			stream = fso.OpenTextFile( path, 1 );
			return stream.ReadAll();
		} finally {
			stream.Close();
		}
	}
} ) {
	while( index < libs.length ) {
		try {
			eval( getSource( libs[ index++ ] ) );
		} catch(e) {
			WScript.Echo( e.description || e.message || "error" );
		}
	}
}
WScript.Echo(
	$R(1,3).map( function(i) {
		return "番号:" + i;
	} ).join(", ")
); // 番号:1, 番号:2, 番号:3

コンソールベースのWSHだとテキスト処理かファイル処理が主になると思うけど、こういうときにEnumerableインターフェイスが使えるのって、個人的にはかなり便利で手放せない感じ。

特に、FileSystemObjectのFilesとかSubFoldersとかを取り回すEnumeratorにEnumerableなラッパーかぶせたりすると、100単位のファイルがあるディレクトリを取りまわしたりするときもメモリを消費しないですむ(処理は遅いけど)ので、お勧めです。需要はなさそうだけど。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/04/24/1462119/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。