给出以下示例:
class X extends (() => {
return "spam"
}) {
constructor() {
super() // Can't access
this.msg = X() // Can't access
}
}
let x = new X()
console.log(x.msg)
如果无法访问箭头功能,为什么可以扩展箭头功能?记录的是:
error: Uncaught TypeError: Cannot call a class as a function
考虑the "new" ES6 definitions,在Javascript中关于什么是类和什么是函数的定义有些模糊。
答案 0 :(得分:1)
可以编译或执行的内容并不表示该内容有效或符合规范。因此,您始终需要检查有关什么是有效的以及什么是无效的规范。您的问题的相关部分可以在14.6.13 Runtime Semantics: ClassDefinitionEvaluation中找到:
[...] 5. If ClassHeritageopt is not present, then a. Let protoParent be the intrinsic object %ObjectPrototype%. b. Let constructorParent be the intrinsic object %FunctionPrototype%. 6. Else, a. Set the running execution context's LexicalEnvironment to classScope. b. Let superclassRef be the result of evaluating ClassHeritage. c. Set the running execution context's LexicalEnvironment to lex. d. Let superclass be ? GetValue(superclassRef). e. If superclass is null, then i. Let protoParent be null. ii. Let constructorParent be the intrinsic object %FunctionPrototype%. f. Else if IsConstructor(superclass) is false, throw a TypeError exception. [...]
并且6.f声明Else if IsConstructor(superclass) is false, throw a TypeError exception.
,并且箭头函数不是构造函数。
因此,在评估类定义时,引擎将需要根据规格引发TypeError
错误。
Chrome(76)实际上在评估let x = new X()
之前抛出了错误:
未捕获的TypeError:类扩展了值()=> { 返回“垃圾邮件” }不是构造函数或null
7.2.4 IsConstructor ( argument )
是具有[[Construct]]内部方法的功能对象。
ClassHeritage
的定义如下:
ClassHeritage [Yield, Await]: extends LeftHandSideExpression[?Yield, ?Await]