new的模拟实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

/**
* new 一个构造函数之后,在构造函数内部做了如下几件事
* 1、创建一个Object实例
* 2、改变原型链
* 3、调用构造函数,并将它的this指向第一步创建的实例
* 4、返回结果
*/


function myNew() {
const angs = [...arguments]


// 1、创建一个实例
const obj = new Object()


// 2、改变实例原型链,实现继承
const Con = angs.shift()
obj.__proto__ = Con.prototype


// 调用构造函数,并将内部this指向实例
const ret = Con.aplly(obj, args)


// 如果构造函数返回的结果是对象,则返回这个对象
// 否则返回第一步创建的实例对象
if (typeof ret === 'object') {
return ret
}

return obj
}