function myNew(fn,...agr) {
//创建一个空对象
let obj = {}
//将空对象的原型指向构造函数的原型(能打印出来,但是obj.name获取不到)
obj._proto_ = fn.prototype
//将构造函数的this指向空对象(这样obj.name就能拿到)
let newObj = fn.apply(obj,agr)
//判断构造函数的返回值是否为对象
return typeof newObj === 'object' ? newObj : obj
}
myNew(function(name,age){
this.name = name
this.age = age
},'张三',25)
测试一下
function myNew(fn,...agr) {
//创建一个空对象
let obj = {}
//将空对象的原型指向构造函数的原型(能打印出来,但是obj.name获取不到)
obj._proto_ = fn.prototype
//将构造函数的this指向空对象(这样obj.name就能拿到)
let newObj = fn.apply(obj,agr)
//判断构造函数的返回值是否为对象
return typeof newObj === 'object' ? newObj : obj
}
function Father (name,age) {
this.name = name
this.age = age
}
function Child () {
this.child = '子'
console.log(this.name) //父
}
Child.prototype = myNew(Father,'父','25')
let child1 = new Child()
console.log(child1.child,child1.name,child1.age) // '子' '父' 20