js new操作符

140 阅读1分钟

前言

最近面试被问到了,没回答上来,在此小记一篇。

new 操作符步骤

  1. 创建一个空对象,空对象的__proto__执行ctor的prototype。
  2. 执行ctor函数,执行空对象,参数是当前函数的参数(除ctor以为),得到一个结果。
  3. 判断一下结果是否是对象或者函数,如果是则返回结果,如果不是返回空对象。

根据操作步骤得到以下代码:

function newOperator (ctor) {
  if (typeof ctor !== 'function') {
    throw 'newOperator function the first param must be a function';
  }
  var newObj = Object.create(ctor.prototype); // 第一步
  var argsArr = [].slice.call(arguments, 1);
  var ctorReturnResult = ctor.apply(newObj, argsArr); // 第二部
  var isObject = typeof ctorReturnResult === 'object' && ctorReturnResult !== null;
  var isFunction = typeof ctorReturnResult === 'function';
  if (isObject || isFunction) {
    // 第三步
    return ctorReturnResult;
  }
  return newObj;
}

在这里有人推荐把第一步分开,例如:

var newObj = new Object();
newObj.__proto__ = Object.create(ctor.prototype);

这样子写其实也行,但是最后看结果的时候,你会发现多了一层,这一层就是ctor。

总结

核心就是三步,空对象继承链,执行,判断。