1

Number オブジェクトを 2 つのサブ関数を持つ関数で拡張しようとしています。サブ関数がこれを介して Number オブジェクトの値にアクセスできないことを除いて、正常に動作します。アクセス方法や、これが可能かどうかはわかりません。

私のコードは次のようになります

var currency = function(prefix) {
    var val = this.toString();
    prefix = prefix || 'R$';

    if(val > 99999) {
        val = val.replace(/(\d+)(\d{3})(\d{2})$/,prefix + " $1.$2,$3");
    } else if(val == 0) {
        val = prefix + ' 0,00';
    } else {
       val = val.replace(/(\d+)(\d{2})$/, prefix + " $1,$2");
    }
    return val;
};

currency.cents = function() {
    var val = this.toString();
    return val == 0 ? '00' : val.substring(val.length - 2);
};

currency.integer = function() {
    var val = this.toString();
    return val == 0 ? '0' : val.substring(0, val.length - 2);
};

Number.prototype.currency = currency; 

alert((12345).currency()); // "R$ 123,45"
alert((12345).currency.cents()); // return " }"

問題は「var val = this.toString();」の行にあります。これは Number オブジェクトの値ではなく、関数自体を参照するためです。

これを達成する方法はありますか?

2 番目の質問: これを機能させるには、12345 の数字を ( ) で囲む必要があるのはなぜですか? 私は数値オブジェクトを拡張していません.12345はそのインスタンスではありませんか?

前もって感謝します

4

1 に答える 1

0

あなたがしようとしているものほど見栄えがよくないかもしれませんが、このように 3 つのメソッドすべてをプロトタイプに直接追加することができます。

var currency = function(prefix) {
    var val = this.toString();
    prefix = prefix || 'R$';

    if(val > 99999) {
        val = val.replace(/(\d+)(\d{3})(\d{2})$/,prefix + " $1.$2,$3");
    } else if(val == 0) {
        val = prefix + ' 0,00';
    } else {
       val = val.replace(/(\d+)(\d{2})$/, prefix + " $1,$2");
    }
    return val;
};

var currencyCents = function() {
    var val = this.currency();
    return val == 0 ? '00' : val.substring(val.length - 2);
};

var currencyInteger = function() {
    var val = this.currency();
    return val == 0 ? '0' : val.substring(0, val.length - 2);
};

Number.prototype.currency = currency;
Number.prototype.currencyCents = currencyCents;
Number.prototype.currencyInteger = currencyInteger;

alert((12345).currency());         // R$ 123,45
alert((12345).currencyCents());    // 45
alert((12345).currencyInteger());  // R$ 123,

では、2 番目の質問です。

これを機能させるには、なぜ 12345 の前後に ( ) を付ける必要があるのですか? 私は数値オブジェクトを拡張していません.12345はそのインスタンスではありませんか?

この質問はもっとトリッキーだと思いました。Nick Craver の回答で、Why don't numberliters have access to Number methods?に対する答えが見つかりました。- 数値には小数が含まれる可能性があるため、数値を括弧で囲んで、ピリオドが関数呼び出し用であり、数値の小数部分ではないことを明確にします。

于 2012-08-21T23:52:40.300 に答える