# 1、实现ES6的class语法(继承)
function inherit(subType,superType){
subType.prototype=Object.create(superType.prototype,{
constructor:{
configurable:true,
enumerable:false,
writeable:true,
value:subType
}
});
//用于继承静态属性
Object.setPrototypeOf(subType,superType);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 2、斐波那契数列及其优化
function fibonacci(n){
if(n<1){
throw new Error("参数有误")
}
if(n===1||n===2){
return 1
}else{
return fibonacci(n-1)+fibonacci(n-2)
}
}
const memory=function(fn){
let obj={};
return function(n){
if(!obj[n]){
obj[n]=fn[n];
};
return obj[n]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
优点:利用函数记忆,将之前计算过的结果保存下来,对于频繁依赖之前的计算结果的函数能够节省大量的时间;缺点是闭包中的obj会额外占用内存。
# 3、co函数的实现(需要promise基础和generator基础)
co
函数库其实就是将两种自动执行器(Thunk
函数和 Promise 对象),包装成一个库。使用 co 的前提条件是,Generator 函数的 yield 命令后面,只能是 Thunk 函数或 Promise 对象
# 4、object.assign的实现
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。并返回目标对象。
//判断是否是复杂对象类型
function isComplexDataType(obj){
let type=typeof obj;
return (type==="object"||type==="function")&&obj!==null;
}
function assign(target,...source){
if(target==null){
throw new TypeError("can't convert undefined or null to object")
}
//利用reduce方法进行遍历
return source.reduce((acc,cur)=>{
//acc必须是引用类型
isComplexDataType(acc)||(acc=new Object(acc));
//cur不能为空
if(cur==null){
return acc;
}
[...Object.keys(cur),...Object.getOwnPropertySymbols(cur)].forEach((key,index)=>{
acc[key]=cur[key];
})
return acc;
},target)//设置初始值
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
← 前端跨域的9种解决方案 浏览器地层渲染机制 →