思路

  • 创建空对象,链接原型到构造函数的显式原型上
  • 执行构造函数,改变this为空对象,保存执行结果
  • 构造函数执行结果是对象就返回该结果;否则返回obj对象

代码

1
2
3
4
5
6
7
8
9
function myNew(fn, ...args) {
// 创建空对象,链接原型到构造函数的显式原型上,obj对象就可以访问原型上的方法和属性
const obj = Object.create(fn.prototype)
// 使用apply执行构造函数,this指向为obj对象
const result = fn.apply(obj, args)
// 如果构造函数执行结果是对象就返回该结果;否则,返回obj对象
return result instanceof Object ?
result : obj
}