最近面试或多或少要求写一写JS的源码,看了很多博客,在此整理一下。
改变this指向
call
1 | /** |
apply
apply和call的区别在于传参的方式不同,apply第二个参数为数组
1 | /** |
bind
- 作为构造函数,new绑定的优先级高于显示绑定和硬绑定
1 | /** |
reduce
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
1 | /** |
new
- 创建新对象
- 修改作用域
- 运行构造函数
- 返回新对象或构造函数返回结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/**
* 模拟new
* @param {function} constructor
* @param {*}args
* @return {*}
*/
function myNew(constructor, ...args) {
const obj = {}; // 创建对象
obj.__proto__ = constructor.prototype; // 继承,访问构造器属性
const result = constructor.apply(obj, args);
// 如果构造函数返回的是引用类型,则返回该引用类型
return typeof result === 'object'
? result
: obj;
}
Object.create
1 | /** |
extend
1 | /** |
instanceof
1 | function instanceOf(obj, target) { |
Promise.all
1 | Promise.all = function(promiseArray) { |
Promise.all 并发控制
1 | /** |