1.创建了一个全新的对象。 2.这个对象会被执行[[Prototype]](也就是__proto__)链接。

    3.生成的新对象会绑定到函数调用的this。

    4.通过new创建的每个对象将最终被[[Prototype]]链接到这个函数的prototype对象上。

    5.如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用会自动返回这个新的对象。

    1. function mockNew () {
    2. // 创建一个全新的对象
    3. var obj = {}
    4. // 取第一个参数
    5. var Constructor = [].shift.call(arguments)
    6. // 关联对象的原型链到构造函数的原型上
    7. // 等同于 Object.setPrototypeOf(obj, Constructor.prototype)
    8. obj.__proto__ = Constructor.prototype
    9. // 通过apply执行构造函数,将this指向obj
    10. var ret = Constructor.apply(obj, arguments)
    11. // 判断构造函数的返回值是否对象,如果是,则返回这个返回值,否则返回这个新的对象
    12. return typeof ret === 'object' ? ret : obj
    13. }