分析
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;
}