关键字new在调用构造函数的时候其实执行了一下几个步骤:
1.创建对象
2.修改此对象的原型,让指向其传入的构造函数的原型对象
3.指向构造函数中的代码(为这个对象添加属性)
4.返回新对象
知道了原理,那我们就开始手动实现一个new吧
function New(fn,...args){
// 创建一个对象,其对象的原型,指向构造函数的原型对象
let obj =Object.create(fn.prototype)
// 指向构造函数中的代码,并修改this,指向obj
let result= fn.apply(obj,args)
// 构造函数本身如果返回的是对象的话,则 返回的就是此对象
// 如果返回值不是对象的话,则 返回对应的obj
return result instanceof Object ? result:obj
}
function A(a,b){
this.a=a
this.b=b
}
const d =New(A,1,2)
console.log(d.a); //1
console.log(d.b); //2
注意:
new 构造函数, 如果此构造函数 有返回值,且返回值是对象的话,则就返回此对象本身。
所以最后判断一下,返回值是不是对象,如果不是,则返回obj
版权声明:本文为qq_48959471原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。