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!!!!