JavaScriptでコマンドを作って実行する

前置き

Firebug1.10にhelpコマンドなるものが入ってました。
consoleでhelpって入力して実行するとFirebugで使える関数等が表示されます。
help();じゃないんですよ。
関数じゃなくてコマンド。
どうやって実現しているんだろうかって気になったのでエスパーして似たようなのを作ってみました。
Firebugのソースは読んでないけど多分おんなじようなことをしているはず。

コード

以下、with文の中でcommandって書いて実行するとcommand is executed.って出力されます。

var obj={};
Object.defineProperty(obj,'command',{
  get : function() {
    console.log('command is executed.');
  }
});
with (obj) {
  command // command is executed.
}

解説

Object.definePropertyでgetアクセサのあるpropertyを定義すれば、getアクセサの関数を関数・メソッド呼び出しではなくproperty参照で実行できます。
さらにwith文でそのpropertyを持ったobjectを指定することで、.や[]なしでproperty参照できるので、コマンドのように実行することが出来るようになります。
Firebugでは少なくとも以前は入力した内容をwith文の中でevalすることでFirebug専用の関数等を使えるようにしていたので、helpコマンドもおそらく同じです。