実行時に取得可能なコメント

rubyならrakeでよく使われるイディオムで

desc "comment for following task"
task :foo do
  # ...
end

ここではtaskメソッドでコメントの対象となるメソッドを定義していますが、おそらくmethod_addedを使って、メソッドが追加される前に設定されたdescの引数を覚えておくことは可能です。

で、困るのがjsです。
jsのfunctionはその名前を取得することができません。

function foo(){
  // ...
}

という風に記述しても、fooはこれが実行される際のthisになっているオブジェクトのfooという属性に代入されるだけで、以下の記述と等価なはず。

this["foo"] = function(){
  // ...
}

つまり代入されるfunction(Functionのインスタンス)は、他の名称で代入される可能性があるので、一意に名前を付けることができません。

で、どうしても実行時にこのfunctionから名前やコメントなどを取得したい場合、以下のような仕掛けを作ってみるのがいいのかなと思いました。

まずはこんな感じの記述を一回実行しておきます。

Function.prototype.desc = function(){
  var comment = "";
  for(var i=0; i<arguments.length; i++){
    comment = comment + " " + arguments[i];
  }
  this._comment = comment;
  return this;
};
Function.prototype.comment = function(){
  return this._comment;
};

で、実際にfunctionを記述する歳には以下のように記述します。

var some_obj = {
  foo: function(){
    // ...
  }.desc("comment for foo")
}

でもこれだと、functionの後にそのコメントを書かなければならないので、functionが長くなると読み難くなってしまいます。いっそのことこんな感じで書けたらいいなーと思うのですが、

var some_obj = {
  foo_desc: "comment for foo",
  foo: function(){
    // ...
  }
}

fooに対するコメントを取得するためには、Object.prototypeに手を入れることになってしまってやな感じです。属性名も増えちゃうし。うーん、どうしたものか・・・