由于旧的浏览器支持,我们都使用 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)
以及它有什么作用。有人能详细解释一下吗?