从子类更改父类的静态方法

时间:2019-07-28 21:26:09

标签: javascript inheritance ecmascript-6 es6-class

我需要从子类中更改Parent的静态方法。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static中我读到:

  

静态方法调用直接在类上进行,而不是   可在该类的实例上调用。

在下面的示例中,我有一个Parent类和一个foo()方法,该方法调用bar()方法(均为静态)。我需要从bar子类中更改Child,以便调用Child.foo()会调用修改后的bar方法,而不是原始方法。

是否有可能(可能是孩子的constructor中的某物)?

class Parent {

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

  static bar() {
    console.log("HERE I AM");
  }

}

class Child extends Parent {

  static bar() {
    super.bar(); // maybe not what I want?
    console.log(", FELLAS!");
  }
}

Parent.foo(); // HERE I AM
Child.foo(); // HERE I AM, FELLAS! (need this!)

2 个答案:

答案 0 :(得分:1)

如果要从子级修改“父级”,只需执行。 Parent是具有属性的对象,static是语法糖。替换方法很简单,就像设置属性一样。可能不是您想要在生产代码中执行的操作。

class Parent {
  static foo() {
    Parent.bar();
  }

  static bar() {
    console.log("HERE I AM");
  }
}

class Child extends Parent {
  static unhack() {
      if (Parent.hack) {
          Parent.bar = Parent.hack
          delete Parent.hack
      }
  }
  
  static hack() {
    if (!Parent.hack) {
       Parent.hack = Parent.bar
       Parent.bar = Child.bar
    }
  }
 
  static foo() {
      Child.hack()
      Parent.foo()
      Child.unhack()
  }

  static bar() {
    if (super.hack) {
      super.hack(); // Call the "shadowed" Parent.bar()
    }
    console.log(", FELLAS!"); // Call the additional code
  }
}

Parent.foo(); // HERE I AM
Child.foo(); // HERE I AM, FELLAS! (need this!)
Parent.bar(); // HERE I AM
Child.bar(); // Probably don't want to do this

答案 1 :(得分:1)

您的问题是foo直接调用Parent.bar(),而不是this.bar()。通过显式引用Parent,它根本不会考虑Child中的覆盖方法。 Child.bar的编写方式以及是否调用super.bar都无关紧要。

class Parent {
  static foo() {
    this.bar();
//  ^^^^
  }
  static bar() {
    return "HERE I AM";
  }
}

class Child extends Parent {
  static bar() {
    return super.bar() + ", FELLAS!";
  }
}

console.log(Parent.foo()); // HERE I AM
console.log(Child.foo()); // HERE I AM, FELLAS!

this方法中的static bar()关键字现在引用了Child调用中的Child.foo()类,并调用了其覆盖的bar方法。

唯一的替代方法(如果无法修改Parent)是也将覆盖foo方法,并在那里显式调用Child.bar()