ES6 inheritance force base class 只调用它自己的成员
ES6 inheritance force base class to only call its own members
用下面的例子,有没有办法让Base的'this'始终引用Baseclass?目前 'this' 的值取决于 Base 是直接调用还是由 class 扩展它调用。
没有 action()
作为 Derived
的一部分不是一个选项,它在那里并且它是 Base
的 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' 方法,并在上下文设置为当前实例的情况下调用它。
但是,这看起来像 hyper-defensive 编程。 A class 应该是 open to extension,不要向后弯腰以防止伸展。如果 child 覆盖了一个方法,调用或不调用 parent 的实现取决于它。如果它有理由重写一个方法,那么它就有它的理由。
如果有一个 private 方法是有意义的,只有实现 class 本身才能调用,甚至派生 classes不应该打电话。 Private class fields 是最近的一个实验,但一些命名约定可以做同样的事情:
class Base {
__private_action() {
...
}
do() {
this.__private_action();
}
}
请注意,如果您真的想要,仍然完全可以覆盖它,但是 leading-underscore 命名约定表示 "don't touch that",这在同意的成年人中应该足够好了。试图过度防御是浪费精力,因为首先没有真正的 "private" 代码,尤其是像 Javascript.
这样的动态语言。
用下面的例子,有没有办法让Base的'this'始终引用Baseclass?目前 'this' 的值取决于 Base 是直接调用还是由 class 扩展它调用。
没有 action()
作为 Derived
的一部分不是一个选项,它在那里并且它是 Base
的 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' 方法,并在上下文设置为当前实例的情况下调用它。
但是,这看起来像 hyper-defensive 编程。 A class 应该是 open to extension,不要向后弯腰以防止伸展。如果 child 覆盖了一个方法,调用或不调用 parent 的实现取决于它。如果它有理由重写一个方法,那么它就有它的理由。
如果有一个 private 方法是有意义的,只有实现 class 本身才能调用,甚至派生 classes不应该打电话。 Private class fields 是最近的一个实验,但一些命名约定可以做同样的事情:
class Base {
__private_action() {
...
}
do() {
this.__private_action();
}
}
请注意,如果您真的想要,仍然完全可以覆盖它,但是 leading-underscore 命名约定表示 "don't touch that",这在同意的成年人中应该足够好了。试图过度防御是浪费精力,因为首先没有真正的 "private" 代码,尤其是像 Javascript.
这样的动态语言。