手写系列之new的实现过程 - 图1


本文章主要是介绍了当实例new的过程中,new操作符到底做了哪些处理

1. 代码文字讲解

  1. function createFactory() {
  2. // 1. 通过shift函数剪切掉数组最后一位 同时修改了arguments的长度
  3. const self = [].shift.call(arguments)
  4. // 2. 定义返回对象
  5. const obj = {}
  6. // 3. 执行需要new的函数 将this指向指向新对象
  7. const result = self.apply(obj, arguments)
  8. // 4. 赋值原型链上的属性 使用api Object.create函数
  9. obj.__proto__ = Object.create(self.prototype)
  10. /**
  11. * function Fn() {}
  12. * Fn.prototype = self.prototype
  13. * obj.__proto__ = new Fn
  14. */
  15. // 5. 如果返回值是对象,返回对象,反之返回定义的对象
  16. return result && typeof result === 'object' ? result : obj
  17. }
  • 其实上述代码中的注释已经说的很清楚了。但是这还是想说👇
    • 第一步:获取实例的函数,以及参数,调用函数进行传参的话,通过shift可以获取第一个参数就是执行函数
    • 第二步:定义一个对象,这个对象就是将来的实例
    • 第三步:通过apply/ call来执行函数,将函数的this指向我们第二步创建的对象,并且拿到返回值
    • 第四步:因为函数原型链的函数也需要调用,所以也需要将对象的proto指向函数.prototype。主要是为了原型链的查找
    • 第五步:最后返回实例,这里的返回有讲究,如果执行函数的返回值是对象,这个对象就是实例。反之就是我们创建的对象就是实例