手写实现`new`操作符

13 阅读1分钟

目的

给出构造函数foo(),实现一个myNew()函数,使得myNew(foo)等同于new foo()

分析

若定义obj = new foo(),则: Object.getPrototypeOf(obj) === foo.prototype

实现


function myNew(Constructor, ...args) {
  const obj = Object.create(Constructor.prototype);
  
  const result = Constructor.apply(obj, args);
  
  if (isValidResult(result)) {
    return result;
  }
  
  return obj;
}

function isValidResult(result) {
  const resultType = typeof result;
  // typeof null === 'object'
  return result && (resultType === 'function' || resultType === 'object');
}