javascript - new super.constructor 是 JavaScript 中的有效表达式吗?

标签 javascript specifications super referenceerror new-expression

我想知道 new super.SomeProperty 形式的表达式在 JavaScript 中是否有效。

这个问题是在处理跨浏览器行为不一致的代码时出现的,例如下面代码片段中的示例。

class Test {
    test() {
        return new super.constructor;
    }
}

console.log((new Test).test());

这会在 Firefox 和 Edge 中打印一个空对象,但会在 Chrome 中抛出一个 ReferenceError 并在 Safari 中抛出一个 SyntaxError。通过在 super.constructor 周围加上括号或使用变量可以很容易地避免该错误,因此这不是真正的限制,而是对语言本身的好奇心问题。我检查了规范,但没有发现任何暗示在这种情况下应该抛出错误的信息,所以我很可能遗漏了什么。

最佳答案

根据 MDN Operator precedence article没有参数列表的 new 低于成员访问权限。这表明 new super.constructor 应该被评估为 new (super.constructor) 并且 Firefox 和 Edge 是正确的。

现在,根据规范:

new super.constructornew NewExpression ( https://tc39.github.io/ecma262/#sec-new-operator )。 NewExpressionMemberExpression 的形式,SuperPropertysuper 的形式。标识符名称。 ES6 标准似乎也是这么说的。所以在我看来 MDN 是正确的,因此 Firefox 和 Edge 符合规范。

关于javascript - new super.constructor 是 JavaScript 中的有效表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50288800/

相关文章:

json - 描述 JSON 模式的工具

python - 未绑定(bind)的 super 对象,super(self, self)

javascript - base64 中的图像未在 Safari 中显示

javascript - App.js 不更新 iOS 模拟器中的修改代码

c - 是否有一个程序可以作为并行程序正确执行但不能作为顺序程序正确执行?

html - 对使用正确的 HTML 规范感到困惑

python:__getattr__ 的协作 super 调用

java - 在 Java 类型参数中,<? extends E> 仅表示严格的子类型?还是 E 也足够?

javascript - 如何一次存储数组中的两个值

javascript - 网络驱动程序错误 : No active session with ID