1

我正在尝试使用具有两个子功能的函数来扩展 Number 对象。它工作正常,除了子函数无法通过 this 访问 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();”这一行 因为 this 指的是函数本身,而不是 Number 对象的值。

有没有办法做到这一点?

第二个问题:为什么我需要在数字 12345 周围加上 ( ) 才能工作?我没有扩展数字对象并且 12345 不是它的一个实例?

提前致谢

4

1 回答 1

0

它可能看起来不如您尝试做的那么好,但您可以像这样将所有三种方法直接添加到原型中。

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,

现在你的第二个问题..

为什么我需要在数字 12345 周围加上 ( ) 才能正常工作?我没有扩展数字对象并且 12345 不是它的一个实例?

我发现这个问题更棘手。我在 Nick Craver 对Why don't number literals have access to Number methods的回答中找到了答案?- 这是因为数字可以有小数,所以用括号括住数字,以明确句点用于函数调用而不是数字的小数部分。

于 2012-08-21T23:52:40.300 回答