new一个函数发生了什么

590 阅读1分钟

分析

1、创建一个全新的对象
2、将新对象的内部属性__proto__指向构造函数的原型,这样新对象就可以访问原型中的属性和方法
3、新对象绑定到函数调用的 this
4、判断函数返回值,如果返回对象类型,就返回该对象,否则返回新创建的对象(注意考虑null的情况)

代码实现

function objectFactory(){
    // 取得该方法的第一个参数(并删除第一个参数),该参数是构造函数
    const Constructor = [].shift.apply(arguments);
    // 将新对象的内部属性__proto__指向构造函数的原型,这样新对象就可以访问原型中的属性和方法
    // obj.__proto__ = Constructor.prototype;
    const obj = Object.create(Constructor.prototype);
    // 取得构造函数的返回值
    const ret = Constructor.apply(obj, arguments);
    // 如果返回值是一个对象就返回该对象,否则返回构造函数的一个实例对象
    return ret !== null && typeof ret === 'object' ? ret : obj;
}