我正在尝试使用具有两个子功能的函数扩展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不是它的实例?
提前致谢
答案 0 :(得分: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?的回答 - 这是因为数字可以有小数,所以用括号括起数字以清楚表明句点是用于函数调用而不是用于数字的小数部分。