手写New
New的过程可以分为以下几步
- 创建一个对象。
- 修改该对象的__proto__的指向构造函数原型(或者通过Object.create创建对象,传入构造函数原型)
- 通过apply或者call,bind执行构造函数内的代码
- 如果执行的结果返回了一个非空对象就返回该对象(既构造函数有返回),否则返回刚刚创建的对象
function myNew(fn,...arg){
if(typeof fn !== 'function'){
console.error('需要传入一个函数')
return ;
}
const res = Object.create(fn.prototype)
const val = fn.apply(res,arg)
if(val){
return val
}
return res
}
function Person(params) {
this.name = params
}
let p1 = new Person('aa')
let p2 = myNew(Person,'bb')
console.log(p1,p2,p1.__proto__===p2.__proto__)