当 babel 将 ES6 类转换为 ES5 时,为什么要使用 Reflect.construct?

时间:2021-05-28 13:10:44

标签: ecmascript-6 babeljs

由于旧的浏览器支持,我们都使用 babeljs 将 ES6 转译为 ES5。当 babel 编译一个从另一个类扩展而来的类时。有一部分编译代码是这样的:

function _createSuper(Derived) {
  var hasNativeReflectConstruct = _isNativeReflectConstruct();
  return function _createSuperInternal() {
    var Super = _getPrototypeOf(Derived),
      result;
    if (hasNativeReflectConstruct) {
      var NewTarget = _getPrototypeOf(this).constructor;
      result = Reflect.construct(Super, arguments, NewTarget);
    } else {
      result = Super.apply(this, arguments);
    }
    return _possibleConstructorReturn(this, result);
  };
}

我知道 _createSuper 函数是创建一个函数来包装调用超类的过程,该函数将 this 绑定为子类的实例,以便子类可以继承其超类的属性。为了完成这个目的,我们只需要让result = Super.apply(this, arguments)。但是代码会检查环境是否支持 Reflect 并优先使用 Reflect.construct。我实际上不知道为什么我们需要 result = Reflect.construct(Super, arguments, NewTarget) 以及它有什么作用。有人能详细解释一下吗?

0 个答案:

没有答案
相关问题