是否在类的静态属性上使用super关键字?

时间:2020-07-28 23:33:44

标签: javascript class super rollupjs

我知道super关键字可用于引用类中的继承属性和方法。也可以在静态方法中使用它,并调用super.staticMethod()。在静态属性上使用super关键字可以吗? Rollup表示这不行,我在将ESModules编译为CommonJs文件时遇到了这个问题。

使用此功能汇总

class A {
  static m() {
    return 1;
  }
}
class B extends A {
  static m() {
    return super.m() + 1;
  }
}
console.log("A", A.m());
console.log("B", B.m());

这里,类AB上有静态方法。 B呼叫super.m(),就像呼叫A.m()

汇总与此不符

class A {
  static score = 5;
  static info = {
    prop1: "hi",
    prop2: "hello"
  }
}
class B extends A {
  static score = super.score + 5;
  static info = {
    ...super.info,
    prop3: "welcome",
    prop4: "good morning"
  }
}
console.log("A", A.score, A.info);
console.log("B", B.score, B.info);

不过,我看不出第二个示例出了什么问题。当我运行它时,它没有任何错误。它是无效的还是无效的javascript,或者汇总只是在抱怨,即使它是有效的javascript吗?当我将super替换为A(例如,用A.score而不是super.score)时。

汇总错误

[!]错误:方法外的'super'关键字

我的rollup.config.js文件

export default {
    input: "index.js",
    output: {
        file: "commonjs/index.js",
        format: "cjs"
    }
}

1 个答案:

答案 0 :(得分:1)

静态类字段are still an experimental proposal

可以在静态属性上使用super关键字吗?

是的。

如果我正确解释了当前的规范草案,则在类字段中使用super.…super[…]会有no early error,只有super(…)arguments是语法错误-并且no early errors专门用于static字段。字段初始化程序are evaluated as if their code was in an anonymous method,他们可以在其中访问接收者(this值)和主对象(super基)。
但是,似乎有an editorial issue关于如何将类值传递给定义算法的,因此重新评估允许super的决定并非不可想象。 Rollup使用的解析器与Chrome不同,这是一个错误,但是我们不知道这两个实现中的哪个。

相关问题