我需要从子类中更改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!)
答案 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()
。