7

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

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

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

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

这会在 Firefox 和 Edge 中打印一个空对象,但ReferenceError在 Chrome 和SyntaxErrorSafari 中会抛出一个。该错误可以很容易地通过使用括号super.constructor或使用变量来规避,因此这不是真正的限制,而是对语言本身的好奇问题。我检查了规范,但找不到任何暗示在这种情况下应该抛出错误的东西,所以我很可能遗漏了一些东西。

4

1 回答 1

3

根据 MDN运算符优先级文章新的没有参数列表低于成员访问。这表明new super.constructor应该评估为new (super.constructor)Firefox 和 Edge 是正确的。

现在,根据规格:

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

于 2018-05-11T09:38:39.230 回答