微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

新的super.constructor是JavaScript中的有效表达式吗?

我想知道新的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新的无参数列表低于成员访问权限.这表明新的super.constructor应该被评估为new(super.constructor),Firefox和Edge是正确的.

现在,根据规格:

new super.constructor是新的NewExpression(https://tc39.github.io/ecma262/#sec-new-operator). NewExpression是MemberExpression的形式,它是SuperProperty的形式,它是super.IdentifierName的形式. ES6标准似乎也一样.因此在我看来MDN是正确的,因此Firefox和Edge符合规范.

原文地址:https://www.jb51.cc/js/156856.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐