模拟JavaScript中的new

new 操作符做了那些事情

  • 创建一个全新的对象
  • 将对象的__proto__指向(链接)构造函数的prototype属性(原型对象)
  • 构造函数通过call或者apply执行,将创建的对象传入,使this指向创建的对象
  • 如果函数没有返回对象类型Object(Function、Array、Data、RegExg、Error),则返回创建的对象的引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function objectFactory () {
const obj = new Object()
// 获取第一个参数,即构造函数
const Constructor = [].shift.call(arguments)

// 更改obj的__proto__为构造函数的原型对象
obj.__proto__ = Constructor.prototype

// 执行构造函数,并改变this指向,为obj绑定属性
const ret = Constructor.apply(obj, arguments)

// 判断ret类型是否为对象类型,是则返回ret,否则返回obj的引用
return typeof ret === "object" ? ret : obj
}

function A (name) {
this.name = name
}

const a = objectFactory(A, '张三') // A { name: "test" }