我是一个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
有没有办法用vanilla javascript做这个,或者这是我必须要修改Function.prototype吗?
答案 0 :(得分:3)
修改Function.prototype
或Number.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());

答案 1 :(得分:3)
您可能对Identity仿函数感兴趣 - 它允许您解除任何函数以对Identity的值进行操作 - 例如,square
和mult
。您可以获得可链接的界面,而无需触及原生原型^ _ ^
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
答案 2 :(得分:1)
您不必修改Function.prototype,而是修改Number.prototype。您正在尝试创建一个作用于数字而不是函数的新方法。这就是你要做的事情:
Number.prototype.square = function() {
return this * this;
}
let x = 4;
let y = x.square().square(); // -> 256
答案 3 :(得分:0)
您可以将square
和num
设置为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);