Javascript-New的实现

79 阅读1分钟

手写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__)
// Person{name: 'aa'} Person{name: 'bb'} true