首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问"this“关键字ES6 JavaScript习惯用法的私有方法

访问"this“关键字ES6 JavaScript习惯用法的私有方法
EN

Stack Overflow用户
提问于 2021-08-14 02:07:48
回答 1查看 983关注 0票数 0

我正在学习JavaScript和NodeJS,因为我正在从事一个工作项目,并且一直在ProtoTypes上大量使用ES6类。我想使用私有方法或类似于私有方法的东西,但这似乎还不是JavaScript类的特性。对于ES6类,有什么常见的模式吗?到目前为止,我已经设计出了一个混乱的策略:

代码语言:javascript
复制
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 };

以及

代码语言:javascript
复制
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

  • Implications和performance

  • Readability for JavaScripters

更别提它看起来不太好了。如果需要的话,我不介意学习ProtoTypes,实际上我喜欢事物分开的方式(我主要用Rust和C编写程序,所以我通常在课堂上不思考),但我想写“现代JavaScript”,更重要的是,如果可能的话,我想写可读的、熟悉的JavaScript,我只是对它的样子没有直觉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-14 03:43:41

私有方法现在是安全的(经过很长一段时间,它们终于是第4阶段了)。如果您的浏览器支持它,则应该可以:

代码语言:javascript
复制
class A {
  #myPrivateMethod(){
     console.log('this is my private method');
  }
  constructor(){
     this.#myPrivateMethod();
  }
}

new A;

this应该像预期的那样工作。视上下文而定。

代码语言:javascript
复制
class A {
  #myPrivateMethod(){
     console.log(this);
  }
  constructor(){
     this.#myPrivateMethod();
     this.#myPrivateMethod.call('someotherthis');
  }
}

new A;

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68779798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档