new 过程
作为 js 的基础,充分了解 new 的实现过程非常重要,今天的目的就是重写 new 的过程,带大家来了解下
/**
* @description 实现类 new的过程 主要是模拟 new 过程
* @return {*}
*/
function createNew() {
// 1. 普通的函数传递过来的参数是arguments, 可以通过shift函数的特性来提取参数中的原函数
const _fn = [].shift.call(arguments)
// 2. 定义一个空对象 将来是要返回的对象
const obj = {}
// 3. 调用原函数,但是函数的this指向新对象
const res = _fn.apply(obj, arguments)
// 4. 将对象的__proto__ 指向函数的原型
Object.setPrototypeOf(obj, _fn.prototype)
// obj.__proto__ = Object.create(_fn.prototype)
// 5. 如果原函数的返回值是对象 直接返回,如果是基本数据类型 返回自己定义的对象
return res && typeof res === 'object' ? res : obj
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 普通的函数传递过来的参数是 arguments, 可以通过 shift 函数的特性来提取参数中的原函数
- 定义一个空对象 将来是要返回的对象
- 调用原函数,但是函数的 this 指向新对象
- 将对象的proto 指向函数的原型
- 如果原函数的返回值是对象 直接返回,如果是基本数据类型 返回自己定义的对象