【发布时间】:2018-07-08 14:54:30
【问题描述】:
我正在学习 ES6 中的类...
我想以某种形式使用私有属性,以便只能从类的实例调用某些方法。
例如使用符号...
/* 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 */
建议如何执行此操作?
【问题讨论】:
-
[_privateMethod]仍然可以直接调用。您想将方法设为私有的原因是什么? -
@Cruiser 我看不出这个问题(关于如何覆盖由符号标识的类方法)与您建议的副本有什么相似之处
-
请注意,您并没有真正的私有方法。例如,您可以使用
a [ Object.getOwnPropertySymbols(Object.getPrototypeOf(a))[0] ]()从另一个无法直接访问_privateMethod的文件中调用a[_privateMethod]。 -
OOP 最佳实践是为了帮助开发人员,而不是被虔诚地观察并在脚下开枪。如果好处不清楚,那就不值得了。
标签: javascript ecmascript-6 symbols es6-class