模拟实现javaScript new操作符

0
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)