LoginSignup
18
17

More than 5 years have passed since last update.

[JavaScript]文字列から関数を作る

Posted at

JavaScriptにはObject.definePropertyという任意のObjectにプロパティを作成する関数が存在する。
これを使用すればgettersetterを定義することができる。
以下のコードはString.prototypefという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
18
17
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17