可访问 "this" 关键字 JavaScript 习语的 ES6 私有方法

ES6 Private Methods with access to "this" keyword JavaScript idioms

我正在学习 JavaScript 和 NodeJS,因为我正在进行一个工作项目,并且一直大量使用 ES6 类 而不是 ProtoTypes。我想使用私有方法或类似私有方法的东西,但似乎这还不是 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 还很陌生,不知道这些在以下方面是如何工作的:

  1. 词法 this,尤其是作用域
  2. 对内存分配和性能的影响
  3. JavaScript人
  4. 的可读性

更不用说它看起来不太好。如果需要的话,我不介意学习 ProtoTypes,我实际上喜欢事物分离的方式(我主要用 Rust 和 C 编程,所以在精神上我通常不会在 类 中思考),但我想写作“现代 JavaScript”,更重要的是可读性,熟悉 JavaScript 如果可能的话,我只是对它的外观没有直觉。

私有方法现在是安全的(经过很长一段时间终于到了第 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;

它不同于class字段初始化器中的箭头函数,其中this是构造的对象。在您的示例中,this 属于正在构造的 Private 对象,尽管您可以通过 .call.apply.[=20 使用不同的 this 调用这些方法=]

至于内存分配将取决于我不知道如何处理它的实现。我确实相信它们是相同的函数对象,即私有方法。但是,您的示例确实为每个实例使用了不同的 Private 对象,尽管每个方法仍然是唯一的。 class 字段也会创建多个函数对象。