繁体   English   中英

如何在 Javascript 中链 function 而不存储先前的值

[英]How to function chain in Javascript without storing previous value

我想要一种将我的功能与这个期望的结果链接在一起的方法。 计算器总是从 0 开始,调用 Calculator 会初始化结果 = 0。计算器有几个函数可以对这个值进行操作,并且可以链接在一起。 在链的末尾,我调用 log 来记录结果。

在这个例子中,我调用计算器两次,我想要的结果是 A = 100,B = 4。相反,我得到 A = 100,B = 204。我明白,因为它是相同的 object,结果不会重新初始化为 0我第二次使用它。

const Calculator = {
  result: 0,
  addNumber(a) {
    this.result = this.result + a;
    return this;
  },

  multiplyNumber(a) {
    this.result = this.result * a;
    return this;
  },

  log() {
    console.log(this.result);
  }
};

// A logs 100
Calculator.addNumber(10).multiplyNumber(10).log();

// B logs 204 instead of 4
Calculator.addNumber(2).multiplyNumber(2).log();

无论如何我可以重组它,所以我第二次调用计算器时,它会重新初始化为 0,而不使用 class 并定义新的计算器?

无论如何我可以重组这个所以我第二次打电话给计算器

永远不会调用Calculator 它不是 function。 (如果你把它变成了一个类)。


如果要将其重置为0 ,则需要明确执行此操作。

您只需要决定何时执行此操作。

你有两个明显的选择:

  • 当你调用log
  • 当您调用一个新方法时,您将其添加到 object 中

Calculator是 object。 每次编写Calculator时,您似乎都在尝试使用它,就好像它正在创建一个新的 object 一样。

可能你想做这样的事情:

const calculator = () => {
    return {
        result: 0,
        addNumber(a) {
            this.result = this.result + a;
            return this;
        },

        multiplyNumber(a) {
            this.result = this.result * a;
            return this;
        },

        log() {
             console.log(this.result);
        }
    };
}

// logs 100
calculator().addNumber(10).multiplyNumber(10).log();

// logs 4
calculator().addNumber(2).multiplyNumber(2).log();

或者像这样:

class Calculator
{
  constructor() {
      this.result = 0;
  }
  
  addNumber(a) {
      this.result = this.result + a;
      return this;
  }

  multiplyNumber(a) {
    this.result = this.result * a;
    return this;
  }

  log() {
    console.log(this.result);
  }
}

// logs 100
(new Calculator()).addNumber(10).multiplyNumber(10).log();

// logs 4
(new Calculator()).addNumber(2).multiplyNumber(2).log();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM