カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

Javascriptでオブジェクトの生成をフックする

概要: Javascriptでオブジェクトの生成時、コールバック関数をフックさせる。


Javascriptでなんらかのオブジェクトを生成する時にフックして、 任意の関数を実行させるスクリプトを作ってみた。

Object.hook = function ( ObjectName, callback ) {
    var original = eval(ObjectName);
    var evalCode = ObjectName + " = function () { return callback.apply( original.apply(null, arguments), arguments ) }";
    eval(evalCode);
}

ライセンスはMIT-Licenseで。使い方はこんな感じ。

var callback = function () { /* callbackの内容 */ }
Object.hook( 'String', callback ); // Stringの生成をフック

ただし、コンストラクタしかフックできないのと、 コンストラクタ経由でオブジェクトを生成しないとcallback関数は呼ばれなかったりする。

ぶっちゃけビルドインオブジェクトのコンストラクタを書き換えても、 Javascriptの構文使ってオブジェクトを生成したらcallback関数は呼ばれないので、 あまり使えない。

たぶんJavascriptの構文使ってオブジェクトを生成した場合、 オリジナルのコンストラクタの中身そのものが呼ばれるんだろうと思う。 だからフックはできない。

ただ、自作コンストラクタは何とかできるので、そういうのには使える様な気がする。

うーん、やっぱ使い道ないんじゃ……。

追記:2007-01-09T09:40:00

はてぶのコメントで、

引用元:b00kmark 面白いが、わざわざ MIT-License にするのはアレかもしれない。

と言われているので、ライセンスについてちょっと補足。

先にいっとくと、このBlogのテキストのライセンスはAboutにあるように、 自動的にCreative commons 帰属 - 非営利 2.1 日本になるので、僕の許可がないと営利ができんのですよ。

許可を出せばいい話なんだけど、いちいち面倒なので、MIT-Licenseになってるわけです。 MIT-Licenseって仕様許諾そのものと、著作者の明示さえすれば後は自由に使えるわけだから、 特に問題ないと僕は思ってたりする。

まあ、仕様許諾のコピーは面倒かも知れないけど、GPLよりかは手軽だと思うんだけどなぁ。