ES6 inheritance force base class 只调用它自己的成员

ES6 inheritance force base class to only call its own members

用下面的例子,有没有办法让Base的'this'始终引用Baseclass?目前 'this' 的值取决于 Base 是直接调用还是由 class 扩展它调用。

没有 action() 作为 Derived 的一部分不是一个选项,它在那里并且它是 Baseaction() 的高级形式是有原因的.

这种行为对我来说是否违反直觉(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.

这样的动态语言。