可访问 "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 还很陌生,不知道这些在以下方面是如何工作的:
- 词法 this,尤其是作用域
- 对内存分配和性能的影响
- 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字段初始化器中的箭头函数,其中this
是构造的对象。在您的示例中,this
属于正在构造的 Private
对象,尽管您可以通过 .call
和 .apply
.[=20 使用不同的 this
调用这些方法=]
至于内存分配将取决于我不知道如何处理它的实现。我确实相信它们是相同的函数对象,即私有方法。但是,您的示例确实为每个实例使用了不同的 Private
对象,尽管每个方法仍然是唯一的。 class 字段也会创建多个函数对象。
我正在学习 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 还很陌生,不知道这些在以下方面是如何工作的:
- 词法 this,尤其是作用域
- 对内存分配和性能的影响
- 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字段初始化器中的箭头函数,其中this
是构造的对象。在您的示例中,this
属于正在构造的 Private
对象,尽管您可以通过 .call
和 .apply
.[=20 使用不同的 this
调用这些方法=]
至于内存分配将取决于我不知道如何处理它的实现。我确实相信它们是相同的函数对象,即私有方法。但是,您的示例确实为每个实例使用了不同的 Private
对象,尽管每个方法仍然是唯一的。 class 字段也会创建多个函数对象。