2017年4月12日水曜日

開発環境

メタプログラミングRuby 第2版(Paolo Perrotta (著)、角 征典 (翻訳)、オライリージャパン)の1部(メタプログラミング Ruby)、2章(月曜日: オブジェクトモデル)、2.1(オープンクラス)、2.1.2(Monetize の例)、2.1.3(オープンクラスの問題点)を JavaScript で取り組んでみる。

HTML5

<button id="run0">run</button>
<button id="clear0">clear</button>
<pre id="output0"></pre>

<script src="sample2.js"></script>

JavaScript

let btn0 = document.querySelector('#run0'),
    btn1 = document.querySelector('#clear0'),
    pre0 = document.querySelector('#output0'),
    p = (x) => {
        pre0.textContent += x + '\n';
    };

let Monetize = {
    fromNumeric: (num, currency = 'USD') => {
        if (currency === 'USD') {
            return {
                format: () =>`$${num}.00`,
            };
        };
        return {
            format: () => `${num}`,
        };
    },
};

Number.prototype.toMoney = function (currency) {
    if (currency) {
        return Monetize.fromNumeric(this, currency);
    }
    return Monetize.fromNumeric(this);
};

// JavaScript の Array に replace メソッドは無いから String で代用。
let replace = (string, original, replacement) => {
    return string.split('').map((e) => e === original ? replacement : e).join('');
};
let testReplace = () => {
    let original = 'abcdeabcde',
        replaced = replace(original, 'a', 'A');

    p(original);
    p(replaced);
};

let beforeReplace = String.prototype.replace;

String.prototype.replace = function (original, replace) {
    return this.split('').map((e) => e === original ? replace : e).join('');
};

let testReplace1 = () => {
    let original = 'abcdeabcde',
        replaced = original.replace('a', 'A');

    p(original);
    p(replaced);
};


let output = () => {
    p('2.1.2 Monetize の例');
    let bargainPrice = Monetize.fromNumeric(99, 'USD');

    p(bargainPrice.format());

    let standardPrice = (100).toMoney('USD');
    
    p(standardPrice.format());

    p('2.1.3 オープンクラスの問題点');
    testReplace();
    p(beforeReplace);
    p(''.replace);
    testReplace1();    
};


btn0.onclick = output;
btn1.onclick = () => {
    pre0.textContent = '';
};

output();


  









						

0 コメント:

コメントを投稿