手写JavaScript new操作符

355 阅读1分钟

本文学习记录了new操作符的实现过程。

new操作符做了什么

  • 创建一个新对象obj
  • 这个对象的__proto__属性会指向构造函数的原型prototype的地址。
  • 构造函数中的this指向新对象obj,并且执行构造函数
  • 如果构造函数无返回值,或者返回值不是对象类型Object(包含Functoin, Array, Date, RegExp, Error),则返回新对象obj;如何构造函数的返回值是Object,则返回它。

模拟new操作符

function newOperator(ctor) {
    // 传入的第一个参数必须为函数
    if (typeof ctor !== 'function') {
        throw new TypeError(ctor + 'is not a function.');
    }
    // ES6 new.target指向的是new调用的构造函数
    newOperator.target = ctor;
    // 1. 创建一个新对象newObj
    // 2. 这个对象的__object__属性指向ctor的原型
    var newObj = Object.create(ctor.prototype);
    // 3. 构造函数ctor中的this指向新对象newObj,并且执行ctor
    var argsArr = [].slice.call(arguments, 1);
    var ctorReturnResult = ctor.apply(newObj, argsArr);
    // 4. 返回值是对象类型,则返回它。否则返回新对象newObj
    var isObject = typeof ctorReturnResult === 'object' && ctorReturnResult !== null;
    var isFunction = typeof ctorReturnResult === 'funcion';
    if (isObject || isFunction) {
        return ctorReturnResult;
    }
    return newObj;
}

参考文章

面试官问:能否模拟实现JS的new操作符