我正在学习JavaScript和NodeJS,因为我正在从事一个工作项目,并且一直在ProtoTypes上大量使用ES6类。我想使用私有方法或类似于私有方法的东西,但这似乎还不是JavaScript类的特性。对于ES6类,有什么常见的模式吗?到目前为止,我已经设计出了一个混乱的策略:
class Private {
constructor(pub) {
this.pub = pub;
this.privateAttribute = "Private Attribute\n";
}
privateMethod() {
process.stdout.write('Private Method\n');
}
privateMethodCallsPublicMethod() {
this.pub.publicMethod();
}
privateMethodUsesPublicAttribute() {
process.stdout.write(this.pub.publicAttribute);
}
}
class aClass {
#private = new Private(this);
constructor() {
this.publicAttribute = "Public Attribute\n";
}
publicMethod() {
process.stdout.write('Public Method\n')
}
publicMethodCallsPrivateMethod() {
this.#private.privateMethod();
}
publicMethodUsesPrivateAttribute() {
process.stdout.write(this.#private.privateAttribute);
}
privateMethodsHaveAccessToPublicMethods() {
this.#private.privateMethodCallsPublicMethod();
}
privateMethodsHaveAccessToPublicAttributes() {
this.#private.privateMethodUsesPublicAttribute();
}
}
module.exports = { aClass };以及
class aClass {
#privateAttribute = "Private Attribute\n";
constructor() {
this.publicAttribute = "Public Attribute\n";
}
publicMethod() {
process.stdout.write('Public Method Called\n');
}
#privateMethod = () => {
process.stdout.write('Private Method Called\n');
}
publicMethodCallsPrivateMethod() {
this.#privateMethod();
}
publicMethodUsesPrivateAttribute() {
process.stdout.write(this.#privateAttribute);
}
#privateMethodCallsPublicMethod = () => {
this.publicMethod();
}
}
module.exports = { aClass };但我对JavaScript非常陌生,我不知道这些是如何工作的:
特别是关于内存分配的scoping
更别提它看起来不太好了。如果需要的话,我不介意学习ProtoTypes,实际上我喜欢事物分开的方式(我主要用Rust和C编写程序,所以我通常在课堂上不思考),但我想写“现代JavaScript”,更重要的是,如果可能的话,我想写可读的、熟悉的JavaScript,我只是对它的样子没有直觉。
发布于 2021-08-14 03:43:41
私有方法现在是安全的(经过很长一段时间,它们终于是第4阶段了)。如果您的浏览器支持它,则应该可以:
class A {
#myPrivateMethod(){
console.log('this is my private method');
}
constructor(){
this.#myPrivateMethod();
}
}
new A;
this应该像预期的那样工作。视上下文而定。
class A {
#myPrivateMethod(){
console.log(this);
}
constructor(){
this.#myPrivateMethod();
this.#myPrivateMethod.call('someotherthis');
}
}
new A;
它不同于类字段初始化器中的箭头函数,其中this是构造的对象。在您的示例中,this属于正在构造的Private对象,尽管您可以通过.call和.apply使用不同的this调用这些方法。
至于内存分配,这将取决于实现,我不知道如何处理它。我确实认为它们是相同的函数对象,也就是私有方法。但是,您的示例确实对每个实例使用了不同的Private对象,尽管每个方法仍然是唯一的。类字段也会创建多个函数对象。
https://stackoverflow.com/questions/68779798
复制相似问题