如何链接 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);