もふくま

は~くまくま

JavaScript言語仕様拡張大作戦1 ~!すでのな 編~

JavaScriptは柔軟すぎる言語である

人によってはprototypeを使わずに俺クラス生成用関数を作って 俺オブジェクト指向したり、Arrayとかのネイティブメソッドに そのままメソッドを追加したり、ネイティブメソッドを俺関数にすり替えたり。

言語自体を変えちゃうことができるような、そういうカオスさ、 自由さはJavaScriptの魅力の一つだとくまは思っているくま。

(可読性低下とかもあるけど、それも引いてもお釣りが来る!)

色々工夫して関数を作ったりして、普通に色々できちゃう。

・・・のですが、本稿ではもっと踏み込んで、JavaScriptでは通常出来ないような 書き方を可能にすること、つまり言語仕様を変えちゃってオレオレ言語にしちゃう 拡張を色々やってみる、のだ!

基本コンボ 関数.toString()→eval()

JavaScriptは関数オブジェクトにtoStringが使える。

書いたコードが文字列で取得できちゃうので自由に自分自身を書き換えて 違うコードに変えてからevalすればよい。

例えば。

!すでのな

//日本語を含む""内を全部逆にする大日本帝国言語仕様
function $s(fn) {
    dat = fn.toString();

    dat = dat.replace(/"(.*[^\x01-\x7E].*)"/gm, function(va, v1) {

    var r = [];
        for (var i = v1.length; i--;) {
            r.push(v1[i]);
        }
        return '"' + r.join('') + '"';
    });

    return eval(["(", dat, ")()"].join(''));
}

受け取った関数オブジェクトからプログラムを文字列で取得し 全角を含む""文字列があった場合、書き換えている。

そして以下のように書くとオレオレ仕様のJavaScriptでコーディングできる。

$s(function() { //この中は独自仕様になる

console.log("しまかぜ");
console.log("なのです!");

//....

});

実行結果

ぜかまし
!すでのな

まとめ

普通に書いたJavaScriptの関数オブジェクトからtoStringで コードを文字列で取得し、自由に書き換えてしまうことで オレオレ拡張JavaScriptが作れる。

これを元にyieldとか5.timesとかも作ってみる予定ですくま。

つづく。