如何链接 javascript 并在两者之间获取价值
How to chain in javascript yet get value in between
好奇怪的标题,我知道。然而问题很简单。在 class 我希望能够做这两件事:
invoice.getAmount(); // returns 1000
和
invoice.getAmount().asCurrency(); // returns 00.00
我都可以,只是不知道如何让两者都起作用。
第二个想法我现在有:
getAmount() {
this._temp = this.amount;
return this;
}
asCurrency(){
if(this._temp){
return "$" + this._temp + ".00";
}
}
那是我真正拥有的东西的丑陋副本,但代表了概念...
有什么想法吗?
谢谢
记住 getAmount
是 return 一个数字。
因此,无法将 asCurrency
链接到 getAmount
的 return 值(不使用 valueOf
),除非 asCurrency
存在于Number
原型。
如果您想在不修改 Number
原型的情况下将所有这些组合在 class 中,您需要使用 valueOf
(最佳解决方案),或者使您的 return getAmount
您的 class 实例的值,以便您可以将其与 asCurrency
链接起来。
您可以覆盖一些内置函数(toString()
and valueOf()
) on the Invoice.prototype
像这样:
function Invoice(amount) {
this.amount = amount;
}
Invoice.prototype.toString =
Invoice.prototype.valueOf = function valueOf() {
return this.value;
};
Invoice.prototype.getAmount = function getAmount() {
this.value = this.amount;
return this;
};
Invoice.prototype.asCurrency = function asCurrency() {
this.value = '$' + this.value.toFixed(2);
return this;
};
var invoice = new Invoice(1000);
console.log(Number(invoice.getAmount()));
console.log(String(invoice.getAmount().asCurrency()));
// or more subtly
console.log(invoice.getAmount() + 0);
console.log(invoice.getAmount().asCurrency() + '');
或者使用 ES6 class
:
class Invoice {
constructor(amount) {
this.amount = amount;
}
toString() {
return this.value;
}
valueOf() {
return this.value;
}
getAmount() {
this.value = this.amount;
return this;
}
asCurrency() {
this.value = '$' + this.value.toFixed(2);
return this;
}
}
var invoice = new Invoice(1000);
console.log(Number(invoice.getAmount()));
console.log(String(invoice.getAmount().asCurrency()));
// or more subtly
console.log(invoice.getAmount() + 0);
console.log(invoice.getAmount().asCurrency() + '');
技巧是使用valueOf()
方法。
class Invoice {
constructor(value) {
this.value = value;
}
getAmount() {
return {
valueOf: _ => this.value,
asCurrency: _ => '$' + this.value
}
}
}
const i = new Invoice(150);
console.log(i.getAmount() + 10); // 160
console.log(i.getAmount().asCurrency()); // '0'
您可以使用 Number.prototype.toLocaleString():
function getAmount() {
return 1000;
}
var result = getAmount().toLocaleString('en-EN', {style: 'currency', currency: 'USD'});
console.log(result);
好奇怪的标题,我知道。然而问题很简单。在 class 我希望能够做这两件事:
invoice.getAmount(); // returns 1000
和
invoice.getAmount().asCurrency(); // returns 00.00
我都可以,只是不知道如何让两者都起作用。
第二个想法我现在有:
getAmount() {
this._temp = this.amount;
return this;
}
asCurrency(){
if(this._temp){
return "$" + this._temp + ".00";
}
}
那是我真正拥有的东西的丑陋副本,但代表了概念...
有什么想法吗?
谢谢
记住 getAmount
是 return 一个数字。
因此,无法将 asCurrency
链接到 getAmount
的 return 值(不使用 valueOf
),除非 asCurrency
存在于Number
原型。
如果您想在不修改 Number
原型的情况下将所有这些组合在 class 中,您需要使用 valueOf
(最佳解决方案),或者使您的 return getAmount
您的 class 实例的值,以便您可以将其与 asCurrency
链接起来。
您可以覆盖一些内置函数(toString()
and valueOf()
) on the Invoice.prototype
像这样:
function Invoice(amount) {
this.amount = amount;
}
Invoice.prototype.toString =
Invoice.prototype.valueOf = function valueOf() {
return this.value;
};
Invoice.prototype.getAmount = function getAmount() {
this.value = this.amount;
return this;
};
Invoice.prototype.asCurrency = function asCurrency() {
this.value = '$' + this.value.toFixed(2);
return this;
};
var invoice = new Invoice(1000);
console.log(Number(invoice.getAmount()));
console.log(String(invoice.getAmount().asCurrency()));
// or more subtly
console.log(invoice.getAmount() + 0);
console.log(invoice.getAmount().asCurrency() + '');
或者使用 ES6 class
:
class Invoice {
constructor(amount) {
this.amount = amount;
}
toString() {
return this.value;
}
valueOf() {
return this.value;
}
getAmount() {
this.value = this.amount;
return this;
}
asCurrency() {
this.value = '$' + this.value.toFixed(2);
return this;
}
}
var invoice = new Invoice(1000);
console.log(Number(invoice.getAmount()));
console.log(String(invoice.getAmount().asCurrency()));
// or more subtly
console.log(invoice.getAmount() + 0);
console.log(invoice.getAmount().asCurrency() + '');
技巧是使用valueOf()
方法。
class Invoice {
constructor(value) {
this.value = value;
}
getAmount() {
return {
valueOf: _ => this.value,
asCurrency: _ => '$' + this.value
}
}
}
const i = new Invoice(150);
console.log(i.getAmount() + 10); // 160
console.log(i.getAmount().asCurrency()); // '0'
您可以使用 Number.prototype.toLocaleString():
function getAmount() {
return 1000;
}
var result = getAmount().toLocaleString('en-EN', {style: 'currency', currency: 'USD'});
console.log(result);