計算機科学のブログ

メタプログラミングを学ぶ Proxy, Reflect, get, Math, メソッド化

ハンズオンJavaScript (あんどうやすし(著)、オライリー・ジャパン)の11章(メタプログラミングを学ぶ)、11.4(練習問題)の11-1の解答を求めてみる。

コード

let extendNumber = num => new Proxy(Object(num), {
    get(target, prop) {
        if (prop in target) {
            let p = Reflect.get(target, prop);
            if (typeof p == 'function') {
                return p.bind(target);
            }
            return p;
        }
        if (prop in Math) {
            return (...args) => Math[prop](target, ...args);
        }
        return undefined;
    }
}),
    en = extendNumber(3.14),
    ens = [
        en.round(),
        en.ceil(),
        en.pow(2),
        en.toString(),
    ];
for (const n of ens) {
    console.log(n);
}

入出力結果(Terminal, Zsh)

% node main.js
3
4
9.8596
3.14
%