JavaScriptにはObject.defineProperty
という任意のObject
にプロパティを作成する関数が存在する。
これを使用すればgetter
やsetter
を定義することができる。
以下のコードはString.prototype
にf
というgetter
を定義するコードである。
Object.defineProperty(String.prototype, 'f', {
get: function () {
var body = this;
return function () {
var params = [];
var args = [];
for (var i = 0; i < arguments.length; i++) {
params.push('$' + i);
args.push('arguments[' + i + ']');
}
return eval('(function (' + params.join(',') + '){return ' + body + ';})(' + args.join(',') + ')');
};
}
});
上記のコードを実行すると任意の文字列からf
にアクセスできるようになる。
このf
は以下のように使用することができる。
var square = "$0 * $0".f; // 引き数を使う。$0で第一引数にアクセスできる
console.log(square(8)); // 64
var A = 10;
var addA = "$0 + A".f; // 外部の変数を使用する。
console.log(addA(20)); // 30
A = 20;
console.log(addA(20)); // 40
var mul = "$0 * $1".f; // 引き数を2つ使う。引き数は$0,$1,...でアクセスできる
console.log(mul(2, 3)); // 6