我想知道 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.constructor
是new NewExpression ( https://tc39.github.io/ecma262/#sec-new-operator )。 NewExpression 是 MemberExpression 的形式,SuperProperty 是 super 的形式。标识符名称。 ES6 标准似乎也是这么说的。所以在我看来 MDN 是正确的,因此 Firefox 和 Edge 符合规范。
关于javascript - new super.constructor 是 JavaScript 中的有效表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50288800/