mixin,柯里化,高阶函数

mixin混入
柯里化(curry)
高阶函数

mixin混入

类的装饰器:ES6 中优雅的 mixin 式继承

什么是 mixin 呢? 最基本的 mixin 其实就是简单地将一个对象的属性复制给另一个对象:

1
2
3
4
5
6
7
8
9
10
11
function mixin(target, src) {
for (var key in src) {
target[key] = src[key]
}
}
var person = {name: "akira", age: 25};
var student = {grade: 1,age:2};
mixin(student, person);
console.log(student); //{grade: 1, name: "akira", age: 25}

JQuery的extend实现mixin

1
2
3
4
5
6
7
8
9
10
11
12
13
var obj1 = {
apple: 0,
banana: { weight: 52, price: 100 },
cherry: 97
};
var obj2 = {
banana: { price: 200 },
durian: 100
};
// 将obj2合并进obj1里
$.extend( obj1, obj2 );

Object.assign

1
2
3
4
let obj1={name:'stage',age:18};
let obj2={city:'shanghai',gender:'男'};
Object.assign(obj1,obj2);
console.log(obj1) //{name: "stage", age: 18, city: "shanghai", gender: "男"}

curry 柯里化

gitbooks:第 4 章: 柯里化(curry)

函数f(x,y) = x+2y
当x=1时,f(1,y) = 1+2y,此时只剩下自变量y
g(y) = 1+2y
我们把f(x,y)变成g(y)的过程称为柯里化
柯里化的作用:减少自变量

1
2
3
4
5
6
7
8
9
function f(x,y){
return x+2*y;
}
function g(y){
return f(1,y);//当x=1时
}
//f(1,2) === g(2) === 5

上面的g(y)是将x=1定死,如果x的值不确定呢?

1
2
3
4
5
6
7
8
9
10
11
function f(x,y){
return x+2*y;
}
function g(x){ //首先将参数x确定下来
return function(y){ //然后return一个关于y的函数
return f(x,y);
}
}
g(1)(2) //5

这样,将原本f(x,y)变成了g(x)(y),每次只传一个参数

再来看个例子

1
2
3
4
5
6
7
8
9
10
11
var temp=[];
function add(n){
if(n){
temp.push(n);
return add;
}else{
return temp.reduce((sum,val)=>sum+val,0);
}
}
add(1)(2)(3)() //6

关于柯里化

从纯粹的语义上,curry化就是lambda表达式(λ)的一个糖
柯里化是因为 lambda 演算(λ)只有一个参数才被发明的,程序里用你除了恶心自己恶心别人并没有什么卵用。
知乎:柯里化在工程中有什么好处?

underscore中的_.partial

高阶函数

满足以下条件中的任意一个就是高阶函数:

  • 接受一个或多个函数作为参数传入
  • return出一个函数
-------------本文结束感谢您的阅读-------------