如果无法访问箭头功能,为什么可以扩展箭头功能?

时间:2019-09-10 14:25:37

标签: javascript ecmascript-6

给出以下示例:

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中关于什么是类和什么是函数的定义有些模糊。

1 个答案:

答案 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]