在 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
构造的新对象,参数被忽略。
下面的代码在 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
构造的新对象,参数被忽略。