2007/04/19
JavaScriptでAOP?
アリエルの若きJavaScriptマスターがAspectJSを見ていました。
中を見ると...格好悪いと言うか、強引と言うか。まあ、こんな強引な文字列操作(indexOf()、substring()、文字列連接)で関数書き換えができてしまうのが凄いと言えば凄いです。 以前(http://dev.ariel-networks.com/Members/inoue/aop-of-emacs)、elispのアドバイスの実装はまったくコードが読めませんでした。S式を書き換えるコードより、ベタな文字列操作で書き換える方が分かりやすいのは皮肉なことです。
new String()で関数を文字列表現にして、文字列操作でコードを差し込んで、new Function()で文字列表現を関数に戻すのが基本的なアイディアです。次のコードを汎用的にしたイメージです(My::onclick()の先頭にalert('before')を差し込む例)。
var My = Class.create(); My.prototype = { initialize: function(elem) { Event.observe(elem, 'click', this.onclick.bind(this)); }, onclick: function() { $('result').innerHTML = 'onclick'; } } var origFunc = new String(My.prototype['onclick']); My.prototype['onclick'] = new Function('var orig = ' + origFunc + ';alert(\'before\'); orig.apply()'); new My($('elem'));
ちなみに、マスターは、これが何の役に立つのかを考えているようです。ロギング、という答えは却下のようです。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/aop-of-javascript/tbping