js中的new做了什么事?

105 阅读1分钟

js中的new做了什么事?

结论

  • new首先会创建一个新空对象
  • 把对象的_proto_指向构造函数的prototype属性,其实就是把空对象的[[Prototype]] 指向构造函数的Prototype,使它两个指向同一个原型
  • 再把构造函数的this指向空对象,绑定空对象的上下文
  • 如果构造函数有返回对象new返回这个对象,如果没用返回值或者返回基本数据类型则返回创建的对象

实现一个new

那我们现在就来实现一个new

//实现一个New函数
function New(fun,...args){
let obj={}  //创建一个空对象
Object.setPrototypeOf(obj,fun.prototype)
 //把fun的prototype属性设置为obj的原型  obj._proto_=fun.prototype
var results=fun.apply(obj,args)    //改变 fun的this指向
return results instanceof Object ? results:obj    //判断是否有返回的对象 
}

测试

function person(name){
  this.name=name   //当this为空对象时,就在空对象设置了name属性
}
console.log(person);
let res=New(person,'kkkk')
console.log(res);   //{name: 'kkkk'}

我们再来看看相应的对象指向

console.log(res.__proto__==person.prototype);  //输出 :true
console.log(res.constructor==person);    //输出:true          win!!!!