下面的代码在 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)
规范说它返回一个传入的对象值。
在 ES6 中,你必须检查 [[construct]]
of builtins 上的部分和 Object(value)
function .第一个陈述是
If NewTarget is neither
undefined
nor the active function, then
Return OrdinaryCreateFromConstructor(NewTarget, "%ObjectPrototype%").
因此,如果您正在执行 new Object({...})
,它仍然会返回 {...}
参数。但是当您从 super()
或作为 Reflect.construct(Object, [{...}], MyCustomTarget)
调用它时,new .target
不是 Object
,那么您只会得到一个从 MyCustomTarget.prototype
构造的新对象,参数将被忽略。
关于javascript - 在 Chrome V8 中实例化从 Object 扩展的类时,super() 不传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36203614/