ES6继承强制基类只调用自己的成员。

问题描述 投票:0回答:1

以下面的例子为例,有没有办法让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();
javascript es6-class
1个回答
0
投票

你可以这样做。

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这样的动态语言中。

© www.soinside.com 2019 - 2024. All rights reserved.