new运算符原理

function simpleNew(fn) {
    // 1.创建一个空对象,并把原型对象指向fn.prototype
    var obj = {}
    obj.__proto__ = fn.prototype
    // Object.create(fn.prototype) // 或者使用Object.create创建对象

    // 2.执行fn,传入this上下文,使fn的熟悉挂载到obj对象上
    var result = fn.call(obj)

    // 3.如果构造函数执行后返回一个“对象”,则会取代整个new出来的结果;如果没有返回对象,则返回new出来的对象
    if(typeof result === 'object') {
        return result
    } else {
        return obj
    }
}
// 对于第3点原理
function Foo() {
    this.name = 'nic'
    return { a: 1 }
}
console.log(new Foo()) // { a: 1 }

function Foo2() {
    this.name = 'nic'
    return 'a'
}
console.log(new Foo2()) // Foo {name: 'nic'}