親鶏と酒とエンジニアリングと私 -2ページ目

親鶏と酒とエンジニアリングと私

自分的に苦労したり新しいと思ったりGoogle先生が答えてくれない技術系の悩みについての解決策を模索していくブログです。

これは以前から書きたかったエントリで、ようやくブログを書く時間ができたので書きます。


あまり使いどころは無いかもしれないけれど、Javascript の関数をオブジェクト指向的にオーバーライドするという話です。
Google先生に聞いても、本当の意味での上書きばかり出てきてしまって、あまりまともな回答が得られなかったので自分で方法を考えてみました。


例えば、

function MainProcess() {
    alert('Main Process');
}
という関数があったとして、


前処理として「alert('Before Process');」

後処理として「alert('After Process');」


という処理を挟んで、MainProcess() を呼び出すことで、前処理と後処理も実行されるというようなケース。


HTMLのどこかにこう書くことで実現できます。(理想はonload処理かな?)
var str = MainProcess.toString();                                 // ①元の関数を文字列として取得する
str = str.substr(str.indexOf('{') + 1);                              // ②関数の内部処理だけを摘出
str = str.substr(0, str.lastIndexOf('}'));                           //  そうしないと⑤で関数が実行されてしまう
MainProcess = function() {                                        // ③元の関数の上書き
    alert('Before Process');                                         // ④前処理を記述する
    eval('function dummyFunc(){' + str + '};dummyFunc();'); // ⑤元の関数のコードを取込
    alert('After Process');                                           // ⑥後処理を記述する
};

もう少しスマートなやり方があれば教えてください。