javascript - 在 ES6 中,如何覆盖父类(super class)中的私有(private)方法?

标签 javascript ecmascript-6 symbols es6-class

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

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

例如使用 Symbol...

/* A.js */

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

const a = new A()
a.do() /* yup */

..._privateMethod 不能直接调用。到目前为止一切顺利。

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

/* B.js */

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

const b = new B()
b.do() /* yup */

建议如何执行此操作?

最佳答案

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

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

关于javascript - 在 ES6 中,如何覆盖父类(super class)中的私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48509267/

相关文章:

ecmascript-6 - (ES6) 类 (ES2017) 异步/等待 getter

javascript根据条件显示或隐藏类

查找所有评论的 JavaScript 正则表达式

javascript - 正则表达式排除JavaScript中的特定网站?

javascript - 将模块中的函数绑定(bind)到 onclick 事件

c++ - 为库中的 C++ 模板实例强制定义符号

javascript - 在两个类之间切换 jQuery = 有​​效但需要额外点击

javascript - 将额外的参数传递给 reactjs 中的 onChange Listener

javascript - ES6 中是否有命名符号的约定?

python - 打开文件 tokenizer.dat 时出现 FREELING 错误