如何在JavaScript中调用静态子类方法

时间:2016-08-18 06:49:58

标签: javascript inheritance

如何从父类的静态方法调用子类的静态方法?

class A {

  static foo(){
    // call subclass static method bar()
  }
}

class B extends A {

  static bar(){
    // do something
  }
}

B.foo()

更新

我尝试这个的原因是A的子类在我的上下文中最适合作为单例,我想在A中使用template method pattern

因为看起来我无法从静态上下文中获取对子类的引用我现在正在导出A的子类实例,它们也可以正常工作。感谢。

更新2

是的,它在一定程度上是重复的(另一个问题不涉及子类化)。即使是静态上下文,引用也是this。所以这有效:

static foo(){
    this.bar();
}

2 个答案:

答案 0 :(得分:0)

我对你的需求感到有点困惑,因为看起来你已经得到了你需要用B.foo()做的事情。那么,这就是你需要的吗?

class A {

  static foo(){
    // call subclass static method bar()
    // Because it is "static" you reference it by just calling it via
    // the class w/o instantiating it.
    B.bar() 

  }
}

class B extends A {

  static bar(){
    // do something
    console.log("I am a static method being called")
  }
}

// because "foo" is static you can call it directly off of 
// the class, like you are doing
B.foo()

// or
var D = new B()
D.bar() // won't work ERROR
A.foo() // Works <-- Is this is specifically what you are asking? Or 
        // calling it in the Super class like B.bar(), that is done in static method foo?

这是你要问的吗?如果这不能回答你的问题,请告诉我我的误解,我会尽力回答。感谢。

答案 1 :(得分:0)

这使模板模式不太优雅,但是您可以通过子类中的super完成此操作,例如:

class A {
  static foo() {
    this.bar()
  }
}

class B extends A {
  static foo() {
    super.foo()
  }
  static bar() {
    console.log("Hello from B")
  }
}

B.foo()