本文章主要是介绍了当实例new的过程中,new操作符到底做了哪些处理
1. 代码文字讲解
function createFactory() {
// 1. 通过shift函数剪切掉数组最后一位 同时修改了arguments的长度
const self = [].shift.call(arguments)
// 2. 定义返回对象
const obj = {}
// 3. 执行需要new的函数 将this指向指向新对象
const result = self.apply(obj, arguments)
// 4. 赋值原型链上的属性 使用api Object.create函数
obj.__proto__ = Object.create(self.prototype)
/**
* function Fn() {}
* Fn.prototype = self.prototype
* obj.__proto__ = new Fn
*/
// 5. 如果返回值是对象,返回对象,反之返回定义的对象
return result && typeof result === 'object' ? result : obj
}
- 其实上述代码中的注释已经说的很清楚了。但是这还是想说👇
- 第一步:获取实例的函数,以及参数,调用函数进行传参的话,通过shift可以获取第一个参数就是执行函数
- 第二步:定义一个对象,这个对象就是将来的实例
- 第三步:通过apply/ call来执行函数,将函数的this指向我们第二步创建的对象,并且拿到返回值
- 至于apply以及call的区别可以参照JavaScript深入系列之call, apply, bind区分
- 第四步:因为函数原型链的函数也需要调用,所以也需要将对象的proto指向函数.prototype。主要是为了原型链的查找
- 第五步:最后返回实例,这里的返回有讲究,如果执行函数的返回值是对象,这个对象就是实例。反之就是我们创建的对象就是实例