在ES6中,如何重写超类中的私有方法?

use*_*947 5 javascript symbols ecmascript-6 es6-class

我正在学习 ES6 中的类...

我想以某种形式使用私有属性,以便只能从类的实例中调用某些方法。

例如使用符号...

/* A.js */

const _privateMethod = Symbol('_privateMethod')
class A {
    [_privateMethod]() {
        return 'yup'
    }
    do() {
        return this[_privateMethod]()
    }
}

const a = new A()
a.do() /* yup */
Run Code Online (Sandbox Code Playgroud)

..._privateMethod 不能直接调用。到目前为止,一切都很好。

但是,我想知道如何在继承自 A 的类中重写 _privateMethod 。例如,以下内容将不起作用:

/* B.js */

const _privateMethod = Symbol('_privateMethod')
class B extends A {
    [_privateMethod]() {
        return 'nope'
    }
}

const b = new B()
b.do() /* yup */
Run Code Online (Sandbox Code Playgroud)

建议如何执行此操作?

Ber*_*rgi 3

再次调用Symbol('_privateMethod')会创建一个新的、不同的符号(即使它具有相同的描述)。您正在使用不同的密钥创建一种不同的方法,而不是覆盖原始方法。

您将需要使用完全相同符号来定义子类中的方法。您可以从 A.js 中获取它,也可以Object.getOwnPropertySymbols(A.prototype)通过将符号作为常量从 A.js 导出_privatMethod并将其导入到 B.js 中(与 一起class A)。但是,如果您想让该类可扩展,我建议根本不使用符号。