[实现new关键字]不得不会的知识!

66 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

不知道大家是不是和我一样。面对手写实现代码都有一些恐惧,但是呢,这又是一个跨不过去的关卡,是我们必须要面对的。所以希望大家能够静下心来,一步一步的去理解这些经常在面试中需要手写的函数。

无论是准备面试,还是对js语言的深入理解,new关键字都是绕不过去的点

前置知识

需要了解this相关的知识点

需要了解原型和原型链相关的知识

如果想忽略过程,直接看完整代码,可以直接拉到文末(不建议)

话不多说,我们直接开始

预览

大概的内容:

  1. 新建一个空对象
  2. 获取构造函数
  3. 将我们新建的空对象和构造函数,建立原型链关系
  4. 执行调用构造函数的方法,需要改变this指向,调入参数
  5. 返回对象

开始编写

1. 新建一个空对象

let obj = {}

2. 获取构造函数

构造函数和参数一起作为参数传入我们自己定义的函数中,所以通过argument去获取,但是我们需要获取argument中第一个参数,也就是构造函数

let myFunction = [].shift.call(arguments)

3. 建立原型链关系

让子函数的__proto__指向构造函数的原型对象prototype,建立原型链关系

让子函数能够通过原型链访问到构造函数上的方法

obj.__proto__ = myFunction.prototype

4.执行调用构造函数的方法

使用call将构造函数的this指向obj,这样新对象obj可以访问构造函数中的方法和属性,并且执行,也就是说,在新对象obj的作用域中执行构造函数,将结果赋给res

let res = myFunction.call(obj,arguments)

5. 返回对象

如果结果res是一个对象,则直接返回res,否则就返回新对象obj

return typeof res === 'object' ? res : obj 

完整代码

function myNew () {
  let obj = {}
  let myFunction = [].shift.call(arguments)
  obj.__proto__ = myFunction.prototype
  let res = myFunction.call(obj, arguments)
  return typeof res === 'object' ? res : obj
}

最后

希望大家可以静下心来去阅读和理解

如果文中有错误的地方,或者需要改进的地方,欢迎大家指正

共勉

如果不理解相关的知识点,也可以看看我的相关文章