以下面的例子为例,有没有办法让Base的'this'总是引用Base类?目前'this'的值取决于Base是直接调用还是由扩展它的类调用。
没有 action()
属于 Derived
不是一个选项,它就在那里,它是一个更高级的形式。Base
's action()
是有原因的。
这种行为在我看来是否有悖于直觉(太多的是c#可能)?
class Base {
do() {
console.error(this.action()); // I say 'this' meaning Base should execute its own action(), and never derived one.
}
action() {
return "Base";
}
}
class Derived extends Base {
action() {
throw "Derived";
}
}
new Base().do();
new Derived().do();
你可以这样做。
class Base {
do() {
console.log(Base.prototype.action.call(this));
}
action() {
return "Base";
}
}
class Derived extends Base {
action() {
throw "Derived";
}
}
new Base().do();
new Derived().do();
这样可以明确地选择特定的类的方法,然后调用它,并将上下文设置为合适的当前实例。
然而,这看起来像是超防御性编程。一个类应该是 延长,而不是弯着腰防止扩展。如果一个子类覆盖了一个方法,那么它要不要调用父类的实现,是它自己的事情。如果它有理由重写一个方法,那么它有它的理由。
如果说有一个 私人 方法,只有实现类本身要调用,甚至派生类也不应该调用。私有类字段 是最近的一个实验,但一些命名惯例也可以做到这一点。
class Base {
__private_action() {
...
}
do() {
this.__private_action();
}
}
请注意,如果你真的想覆盖它,还是完全可以的, 但前导下划线的命名惯例是 "不要碰它 "的信号, 这在同意的成年人中应该是足够好的。试图过度防御是浪费精力,因为本来就没有真正的 "私密 "代码,尤其是在Javascript这样的动态语言中。