开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
不知道大家是不是和我一样。面对手写实现代码都有一些恐惧,但是呢,这又是一个跨不过去的关卡,是我们必须要面对的。所以希望大家能够静下心来,一步一步的去理解这些经常在面试中需要手写的函数。
无论是准备面试,还是对js语言的深入理解,new关键字都是绕不过去的点
前置知识
需要了解this相关的知识点
需要了解原型和原型链相关的知识
如果想忽略过程,直接看完整代码,可以直接拉到文末(不建议)
话不多说,我们直接开始
预览
大概的内容:
- 新建一个空对象
- 获取构造函数
- 将我们新建的空对象和构造函数,建立原型链关系
- 执行调用构造函数的方法,需要改变this指向,调入参数
- 返回对象
开始编写
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
}
最后
希望大家可以静下心来去阅读和理解
如果文中有错误的地方,或者需要改进的地方,欢迎大家指正
共勉
如果不理解相关的知识点,也可以看看我的相关文章