gpt4 book ai didi

javascript - 函数的子函数作为原型(prototype)

转载 作者:行者123 更新时间:2023-11-28 09:43:54 26 4
gpt4 key购买 nike

我正在尝试使用具有两个子函数的函数来扩展 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();”行中因为 this 引用的是函数本身,而不是 Number 对象的值。

有什么办法可以实现这一点吗?

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

提前致谢

最佳答案

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

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,

现在回答你的第二个问题..

Why I need to put ( ) around the number 12345 for this to work? I'm not extending the number object and 12345 is not an instance of it?

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

关于javascript - 函数的子函数作为原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com