有什么方法可以通过 属性 访问函数的 return 吗?

Is there any way to make a function's return accessible via a property?

我是一名 JS 开发人员,正在尝试函数式编程思想,我想知道是否有任何方式以编写 promise 链的方式将链用于同步函数。

例如:

function square (num) {
  return num * num;
}
let foo = 2 
let a = square(foo) //=> 4
let b = square(square(foo)) //=> 16

很公平,但我想做的(通常是为了使代码解析更容易)是通过将这些方法作为链的第一个参数传递来将这些方法链接在一起。所以这样的事情会起作用:

let c = square(foo)
          .square()
          .square() //=> 256

有什么方法可以用原版 javascript 做到这一点,还是我必须修改 Function.prototype 才能做到这一点?

您不必修改 Function.prototype,但 Number.prototype。您正在尝试创建一种作用于数字而非函数的新方法。这就是您要执行的操作:

Number.prototype.square = function() {
  return this * this;
}

let x = 4;

let y = x.square().square(); // -> 256

修改Function.prototypeNumber.prototype确实是个坏主意,因为你会污染默认的JavaScript对象,说:如果其他框架也做坏事并添加他们的东西怎么办拥有 square?

推荐的方式是自己做一个对象。

function num(v) {
    this.v = v;
    this.val = function() { return this.v; };

    this.square = function() { this.v = this.v * this.v; return this; };
    //and you can add more methods here
    this.sqrt = function() { this.v = Math.sqrt(this.v); return this; };
    return this;
}

var n = new num(2)
console.log(n.square().square().sqrt().val());

您可以将 squarenum 设置为 square 调用的 属性`

function square (num) {

  if (!this.square) {
    this.square = square;
    this.num = num || 0;
  };
  
  if (num === undefined) {
    this.num *= this.num
  }
  else if (!isNaN(num)) {  
   this.num *= num;
  };
  return this;
  
}

let foo = 2;
let c = new square(foo).square().square();
console.log(c.num);

您可能对 Identity 仿函数感兴趣 – 它允许您提升任何函数以对 Identity 的值进行操作 – 例如,下面的 squaremult。您可以获得一个可链接的界面,而无需接触本机原型 ^_^

const Identity = x => ({
  runIdentity: x,
  map: f => Identity(f(x))
})

const square = x => x * x

const mult = x => y => x * y

let result = Identity(2)
  .map(square)
  .map(square)
  .map(square)
  .map(mult(1000))
  .runIdentity
  
console.log(result)
// 256000