一、执行new操作符的细节
- 创建一个实例对象,并把这个对象绑定在当前构造函数的原型对象上。
- 改变this的指向到这个实例上,此时的this指向是最强的效果。
- 如果显式 return 且 return 的值为引用数据类型,则返回这个值;否则返回实例。
二、模拟new操作符
function myNewCall(fn){
// 稍微判断一下
if (Object.prototype.toString.call(fn) !== '[object Function]') {
throw '不是一个函数';
}
// 原型对象
const prototype = fn.prototype;
// 参数
const args = Array.prototype.slice.call(arguments, 1);
// 实例对象
const obj = Object.create(prototype);
// 绑定this,因为不用new,那么bind显式绑定就是最强的了
const _fn = fn.bind(obj);
// 赋值参数
_fn(...args);
// 返回实例
return obj;
}