function Person(name){
this.name = name
}
// function myNew(name){
// var o = {}
// o.__proto__ = Person.prototype
// Person.call(o,name)
// return o
// }
function myNew(ctor){
if(typeof ctor !== 'function'){ //判断传入参数是否为function类型
throw 'muNew的第一个参数必须为function'
}
// 创建一个新对象
var o = {}
try {
o.__proto__ = ctor.prototype //将构造函数的作用域赋给新对象,也就是改变上下文 ,让this指向这个新对象
} catch (error) {
Object.setPrototypeOf(o, ctor.prototype)
}
var result = ctor.apply(o,[].slice.call(arguments,1)) //执行构造函数,传入形参(去掉第一个参数:因为第一个参数为传入的构造函数),获取返回结果
// console.log(123,result)
return typeof result === 'object' ? result : o //如果返回值为引用类型, 返回 返回值 否则就返回新创建的对象o
// * 所以构造函数的返回值不能为引用类型 (最好不要有返回值)
}
var a = myNew(Person,"baoza")
// var a = new Person("baoza")
console.log(a.name)
console.log(a instanceof Person)