Personal tools
You are here: Home ブログ 井上 JavaScriptでAOP?
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

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'));

ちなみに、マスターは、これが何の役に立つのかを考えているようです。ロギング、という答えは却下のようです。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/aop-of-javascript/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.