簡體   English   中英

訪問“this”關鍵字的 ES6 私有方法 JavaScript 成語

[英]ES6 Private Methods with access to "this" keyword JavaScript idioms

我正在為一個工作項目學習 JavaScript 和 NodeJS,因為我正在學習 go,並且一直大量使用 ES6 類而不是 ProtoType。 我想使用私有方法或類似私有方法的方法,但似乎這還不是 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. 對 memory 分配和性能的影響
  3. JavaScript 的可讀性

更不用說它看起來並不好看。 如果需要,我不介意學習 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 字段初始值設定項中的箭頭 function,其中this是構造的 object。在您的示例中, this屬於正在構造的Private object,盡管您可以通過.call.apply使用不同的this調用這些方法。

至於 memory 分配將取決於我不知道如何處理它的實現。 我確實相信它們是相同的 function object ,即私有方法。 但是,您的示例確實為每個實例使用了不同的Private對象,盡管每個方法仍然是唯一的。 class 字段也會創建多個 function 對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM