作为原型的函数的子函数

Sub functions of a function as a prototype

本文关键字:函数 子函数 原型      更新时间:2023-09-26

我试图用一个有两个子函数的函数来扩展Number对象。它工作得很好,只是子函数无法通过此访问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对象的值。

有什么办法可以做到这一点吗?

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

提前感谢

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

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对为什么数字文字不能访问number方法的回答?-这是因为数字可以有小数,所以用括号将数字括起来,以清楚地表明句点是用于函数调用的,而不是用于数字的小数部分。