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)
建议如何执行此操作?
再次调用Symbol('_privateMethod')会创建一个新的、不同的符号(即使它具有相同的描述)。您正在使用不同的密钥创建一种不同的方法,而不是覆盖原始方法。
您将需要使用完全相同的符号来定义子类中的方法。您可以从 A.js 中获取它,也可以Object.getOwnPropertySymbols(A.prototype)通过将符号作为常量从 A.js 导出_privatMethod并将其导入到 B.js 中(与 一起class A)。但是,如果您想让该类可扩展,我建议根本不使用符号。