New 关键字
手写一个New 关键字,一个简单的版本
function myNew(fn, ...args) {
// 创建一个对象
const obj = {}
// 修改原型指向
obj.__proto__ = fn.prototype
// 调用构造函数,修改this指向新创建的对象
fn.apply(obj, args)
// 返回新对象
return obj
}
另一个比比较全一点的版本
function _new(constructor, ...args) {
// 构造函数类型合法判断
if(typeof constructor !== 'function') {
throw new Error('constructor must be a function');
}
// 新建空对象实例
let obj = new Object();
// 将构造函数的原型绑定到新创的对象实例上
obj.__proto__ = Object.create(constructor.prototype);
// 调用构造函数并判断返回值
let res = constructor.apply(obj, args);
let isObject = typeof res === 'object' && res !== null;
let isFunction = typeof res === 'function';
// 如果有返回值且返回值是对象类型,那么就将它作为返回值,否则就返回之前新建的对象
return isObject || isFunction ? res : obj;
};
参考:
https://juejin.cn/post/6844903704663949325#heading-7
https://juejin.cn/post/6844903582790057998
https://juejin.cn/post/6994000994300330021
https://juejin.cn/post/7023906112843808804