prototype.jsが大好きだ。組み込みオブジェクトのprototypeを汚染拡張しているところが大好きだ。
なので、WSHでも使ってみたい。
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 }
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単位のファイルがあるディレクトリを取りまわしたりするときもメモリを消費しないですむ(処理は遅いけど)ので、お勧めです。需要はなさそうだけど。
セコメントをする