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とかも作ってみる予定ですくま。
つづく。