一、new的底层实现
1)创建一个空对象{}
2)将该空对象的原型指向构造函数的原型;
3)改变this指向,调用构造函数,为空对象添加属性和方法,获得构造函数的返回值;
4)判断返回值类型,如果为引用类型,则返回返回值;如果为简单数据类型,则返回该空对象。
二、代码实现
function myNew(Fn,...args) {
// 1.创建一个空对象
let obj = {}
// 2.把新对象的__proto__指向其构造函数的prototype
obj.__proto__ = Fn.prototype
// 3.改变构造函数this指向空对象 并调用
console.log(args)
let res = Fn.apply(obj,args)
//let res = Fn.call(obj,...args)
// 4.判断函数执行结果类型,如果为引用类型,则返回函数执行结果,否则返回新对象
if (res instanceof Object)
return res
else
return obj
}
三、代码测试:
function Son(name,age) {
this.name = name
this.age = age
// return [1,2,3]
}
let f = new Son('zs',14)
console.log(f)
let mf = myNew(Son, 'ls',13)
console.log(mf)
测试结果:
return 数组时: