使用 Javascript 的方法链接 - 加减问题

Method chaining with Javascript - Plus Minus Question

我遇到了一个使用方法链创建加减函数的代码挑战。我创建了如下代码,但在输出渲染时最终失败了 像 plus(3).minus(2).value()minus(3).minus(3).value() 那种方法调用

代码如下

function plus(valuez)
    {
      this.valuez = this.valuez+ valuez;
        function value{
            return  valuez
        }
      
        plus.minus = minus;
          plus.value = value;
         plus.plus = this;

        return this;
    }


  function minus(valuez)
    {
       this.valuez = this.v+ valuez;
        function value(){
            return  valuez
        }
        minus.plus = plus;
        minus.minus = this
        minus.value = value;

        return this;
    }

预期输出是 1 和 6 但我只得到打印的最后输入的数字。我该如何解决这个问题?

class Box {
  constructor(v) { this._value = v }
  plus(v) { this._value += v; return this; }
  minus(v) { this._value -= v; return this; }
  value() { return this._value; } 
}
function plus(v) { return new Box(v) }
function minus(v) { return new Box(-v) }

console.log("plus(3).minus(2).value()", plus(3).minus(2).value());
console.log("minus(3).minus(3).value()", minus(3).minus(3).value());
 


function plus (x) { return { _value: x, plus(y){ return plus(this._value+y) }, minus(y){ return plus(this._value-y) }, value(){ return this._value } } }
function minus(x) { return plus(-x) }
console.log("plus(3).minus(2).value()", plus(3).minus(2).value());
console.log("minus(3).minus(3).value()", minus(3).minus(3).value());


使用闭包

function plus (x) { return { plus(y){ return plus(x+y) }, minus(y){ return plus(x-y) }, value(){ return x } } }
function minus(x) { return plus(-x) }
console.log("plus(3).minus(2).value()", plus(3).minus(2).value());
console.log("minus(3).minus(3).value()", minus(3).minus(3).value());

如果没有 constructorclass-sugar,您可以 return 使用来自 addition/subtraction 方法的闭合值的对象。类似于:

const { plus, val, reset } = PM();

console.log(plus().plus(3).minus(4).plus(25).plus(4).trace());
console.log(reset().minus(2).plus(33).val());

function PM() {
  let values = [];
  let traced = [];
  const reset = () => {
      values = [];
      traced = [];
      return ret;
  };
  const add = value => {
    const calc = +(values[values.length-1] || 0) + value; 
    traced.push(`${values[values.length-1] || 0}${
      !value || value >= 0 ? "+" : ""}${value || 0}=${calc || 0}`);
    values.push(calc || 0);
    return ret;
  };
  const ret = {
    plus: value => add(value),
    minus: value => add(-value),
    val: () => values,
    trace: () => traced,
    reset,
  };
  return ret;
}

或者结合这个with an embedded constructor