実行時に取得可能なコメント
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に手を入れることになってしまってやな感じです。属性名も増えちゃうし。うーん、どうしたものか・・・