javascript - 在 Chrome V8 中实例化从 Object 扩展的类时,super() 不传递参数

标签 javascript google-chrome ecmascript-6 v8 babeljs

下面的代码在 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/

相关文章:

JavaScript |展开运算符更新嵌套值

javascript - 变量范围 Javascript 模块模式

javascript - 放置、修补和删除不会返回错误

javascript - 如何在 Marklogic 中使用转换插入 XML 标签?

google-chrome - Chrome 扩展 oAuth 请求重定向页面未加载

google-chrome - 基于 Chrome 的浏览器不断崩溃并出现错误 61696

python - 使用 Python 通过 Selenium WebDriver 打开 chrome 扩展

javascript - 检查 Set 是否包含 Javascript 中的列表

javascript - JS/ES6 : How to get specific fields of object array and return a single object with specific value?

javascript - 命名 IIFE 和立即调用名称函数之间的区别?