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
周围加上括号或使用变量可以很容易地规避该错误,因此这不是真正的限制,而是对语言本身的好奇问题。我检查了规范,但找不到任何暗示在这种情况下应该引发错误的东西,所以我很可能遗漏了一些东西。
【问题讨论】:
好吧class
es aren't supported by IE at all。这些天有 many JS standards 有不同的支持(主要被 IE 毁了)。如果您想使用 ECMAScript 2015 定义,我建议您使用像 Babel 这样的预编译器。
我不清楚new super.constructor
中的点(在superPropertyReference 中定义)是否应该与成员访问运算符superPropertyReference 具有相同的运算符优先级。
我在规范中没有找到任何关于super
在new ...
的上下文中应该如何表现的内容。国际海事组织。这是一个未指明行为的案例
【参考方案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)。 NewExpression 是 MemberExpression 的形式,它是 SuperProperty 的形式,它是 super 的形式。标识符名称。 ES6 标准似乎也是这么说的。所以在我看来,MDN 是正确的,所以 Firefox 和 Edge 都符合规范。
【讨论】:
整个答案围绕着“NewExpression 是 MemberExpression 的形式”。你能准确的参考吗? @DenysSéguret 规范到处都有链接。我认为tc39.github.io/ecma262/#sec-new-operator 新操作员应该吃掉所有符合 MemberExpression 条件的东西,直到找到参数。 @AndrewSvietlichnyy 这也是运算符优先规则的结果,但我无法填补的漏洞是“Super.constructor 是 MemberExpression 吗?”。这当然是有道理的,但我认为问题在于规范。 @DenysSéguretconstructor
不只是一个普通的属性名称吗? Chrome 将 new super.constructor
解析为 (new super).constructor
和 new 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
如何在不使用 for 循环的情况下创建一个新列表,其中 new_array[i][j] = b[a[i][j]](a 是数组,b 是向量)