2009年12月08日

WSHの各種オブジェクトのメソッドはどうやらfunctionではないらしい

WSH(wscript.exe或いはcscript.exe)と、XULRunnerのjs.exe(或いはxpcshell.exe)でのJavaScript(JScript)実行時の違いを確認したくて、ちょっとしたコードを書いた。

それぞれ文字列出力用メソッドが異なり、以下のようになっている。

WSH
WScript.Echo
XULRunner
print

毎回書き直すのもアホくさいので、以下のように書いてみた。

if(typeof print === 'undefined') { print = WScript.Echo; }

// ここから下にテスト用コード

もはや何の説明も要らない程単純なコード。で、WSH環境で実行してみる。

D:\Documents and Settings\amaisaeta\test_error.js(1, 36) Microsoft JScript 実行時
エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。

あるぇ?

XULRunner環境下では勿論問題ない。36行目といったら、print = WScript.Echo;の部分。意味が分からん。

少し悩んで、WScript.Echo(typeof WScript.Echo);を実行してみた。

unknown

あるぇ?
"object"でも"function"でもなく、unknown?

……確かによく考えてみたら、WSHの各種オブジェクトはActiveXオブジェクトだったような

で、ググってみると、

最速の人の大昔のエントリに書いてあるんですけど、

IEのActiveXObjectっていうのはちょっと特殊で、メソッドなんかがJavaScriptのfunctionではない。

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
alert(typeof xmlhttp.open); // unknown

こうなる。xmlhttp.openはfunctionではなくて謎オブジェクト。

IEでXMLHttpRequestを使えるようにする

つまりunknownってのはメソッドだと思って良いハズ。

という記述を発見
つまりunknownってのはメソッドだと思って良いハズ。とあるが、
"unknown"はメソッド("function")に似て非なるナニモノか
と考えといた方が良いのかもしれない。

つまり、

// if(typeof print === 'undefined') { print = WScript.Echo; }
// これを……
if(typeof print === 'undefined') { print = function(arg) { WScript.Echo(arg); } } // こうする

こうか。
最も、これだと1引数しか渡せない。可変長引数を更に別関数に渡したい時ってどうやれば良いんだろう……?

ActiveXオブジェクトだったような
COMオブジェクトだったかもしれない。どっちでもいいや。
posted by 天井冴太 at 21:52 | Comment(0) | TrackBack(0) | Study | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

コメント欄右下をドラッグ&ドロップすると、コメント欄の拡大縮小が出来ます。
認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。