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

Posted

技术标签:

【中文标题】new super.constructor 是 JavaScript 中的有效表达式吗?【英文标题】:Is new super.constructor a valid expression in JavaScript? 【发布时间】:2018-10-21 15:54:48 【问题描述】:

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

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

class Test 
    test() 
        return new super.constructor;
    


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

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

【问题讨论】:

好吧classes aren't supported by IE at all。这些天有 many JS standards 有不同的支持(主要被 IE 毁了)。如果您想使用 ECMAScript 2015 定义,我建议您使用像 Babel 这样的预编译器。 我不清楚new super.constructor 中的点(在superPropertyReference 中定义)是否应该与成员访问运算符superPropertyReference 具有相同的运算符优先级。 我在规范中没有找到任何关于supernew ... 的上下文中应该如何表现的内容。国际海事组织。这是一个未指明行为的案例 【参考方案1】:

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

现在,根据规格:

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

【讨论】:

整个答案围绕着“NewExpression 是 MemberExpression 的形式”。你能准确的参考吗? @DenysSéguret 规范到处都有链接。我认为tc39.github.io/ecma262/#sec-new-operator 新操作员应该吃掉所有符合 MemberExpression 条件的东西,直到找到参数。 @AndrewSvietlichnyy 这也是运算符优先规则的结果,但我无法填补的漏洞是“Super.constructor 是 MemberExpression 吗?”。这当然是有道理的,但我认为问题在于规范。 @DenysSéguret constructor 不只是一个普通的属性名称吗? Chrome 将 new super.constructor 解析为 (new super).constructornew super 不是有效的语法,因为 super 既不是 NewEpxression 也不是 MemberExpression。 不,不是这样:看这个:tc39.github.io/ecma262/#sec-makesuperpropertyreference

以上是关于new super.constructor 是 JavaScript 中的有效表达式吗?的主要内容,如果未能解决你的问题,请参考以下文章

错误:Implicit super constructor xx() is undefined for default constructor.

Implicit super constructor Object() is undefined for default constructor. Must define an explicit c(

Error:Implicit super constructor People() is undefined for default constructor. Must define an expli

C++中的new函数怎么用?

如何在不使用 for 循环的情况下创建一个新列表,其中 new_array[i][j] = b[a[i][j]](a 是数组,b 是向量)

关于c语言中new的使用