在 Chrome V8 中实例化从对象扩展的 class 时,super() 不传递参数

super() does not pass arguments when instantiating a class extended from Object in Chrome V8

下面的代码在 Chrome V8 中记录为 false,但在 Babel 中记录为 true。 feedback from Google 说 logging false 是应该的,而 logging true 是 Babel 的一个错误。我查看了 ES6 规范,但仍然无法理解其背后的机制。如有任何想法,我们将不胜感激!

class NewObj extends Object{
  constructor(){
    super(...arguments); // In V8, after arguments === [{attr: true}]
                         // is passed as parameter to super(),
                         // this === NewObj{} in V8; 
                         // but this === NewObj{attr: true} in Babel.
  }
}
var o = new NewObj({attr: true});
console.log(o.attr === true);

事实上,您得到的关于 Chrome 错误的反馈是正确的。从 ES5 到 ES6,有些事情确实发生了变化。 Babel 对此无能为力,而 Edge 还没有改变它。或者这是一个勘误:-)

ES5 new Object(value) 规范说它 return 是一个传入的对象值。

在 ES6 中,您必须检查 [[construct]] of builtins and the Object(value) function 上的部分。第一个陈述是

If NewTarget is neither undefined nor the active function, then
Return OrdinaryCreateFromConstructor(NewTarget, "%ObjectPrototype%").

因此,如果您正在执行 new Object({…}),它仍然会 return {…} 参数。但是当你从 super()Reflect.construct(Object, [{…}], MyCustomTarget) 调用它时,new.target 不是 Object,那么你将获取从 MyCustomTarget.prototype 构造的新对象,参数被忽略。