Javascript 导出的类中是否可以有私有成员?

Javascript 导出的类中是否可以有私有成员?,javascript,node.js,class,private,module.exports,Javascript,Node.js,Class,Private,Module.exports,我知道node.js中的所有内容都是私有的,除非您将其导出 我找不到导出整个类的其他方法,但我的目标是使privateMethod()从类导入和实例化的位置无法访问 #!/usr/bin/env node 'use strict' module.exports = class DBConnector { constructor() {} publicMethod() {} privateMethod() {} } 有解决办法吗,还是我必须把它公之于众 提前感谢您的帮

我知道node.js中的所有内容都是私有的,除非您将其导出

我找不到导出整个类的其他方法,但我的目标是使
privateMethod()
从类导入和实例化的位置无法访问

#!/usr/bin/env node

'use strict'

module.exports = class DBConnector {
    constructor() {}
    publicMethod() {}
    privateMethod() {}
}
有解决办法吗,还是我必须把它公之于众


提前感谢您的帮助。

在2021年编辑:

Javascript有一个针对私有成员/方法的提案(从2021年初开始,目前处于第3阶段)。有关更多详细信息,请参见此。其中一部分是在Chrome和Nodejs中实现的,而不是在Safari和Firefox中实现的

要使用此功能,请在方法前面加上
#
,如下所示:

class ClassWithPrivateMethod {
  #privateMethod() {
    return 'hello world'
  }

  getPrivateMessage() {
    return this.#privateMethod()
  }
}
这将是不支持此功能的Javascript引擎中的语法错误


2019年的原始答案。

私人会员的工作环境

Javascript本身没有私有方法的概念。因此,如果您在一个类上定义了一个方法,那么任何引用该类实例的代码都可以调用该方法。Javascript中没有私有的方法定义

也就是说,有许多变通方法可以为您提供在私有对象上操作的代码,这些对象不能从模块外部调用。下面是一个例子:

'use strict'

// declare privateMethod as a local function that can only be called from within this module
function privateMethod(obj, args) {
   // private code here
   // reference instance with obj.method() or obj.data
   obj.otherPublicMethod()
}

module.exports = class DBConnector {
    constructor() {}
    publicMethod() {
        // call code for private method
        privateMethod(this, ...);
    }
    otherPublicMethod() {}
}
这是真正私有的,因为该方法的代码不在原型上,因此无法从该模块外部发现或调用。当然,您必须稍微不同地调用它,因为它不是一个“真正的”方法。但是,这是因为所有“真正”的方法都是可以从外部发现和调用的


如果希望私有方法本身使用
this
引用当前对象,则只需更改调用方法的方式:

'use strict'

// declare privateMethod as a local function that can only be called from within this module
function privateMethod(args) {
   // private code here
   // can reference this as in any normal method this.method() or this.data
   this.otherPublicMethod()
}

module.exports = class DBConnector {
    constructor() {}
    publicMethod() {
        // call code for private method using .call()
        privateMethod.call(this, ...);
    }
    otherPublicMethod() {}
}

仅供参考,TypeScript同时支持私有方法和属性。这是一个让你看看它是如何工作的。当然,这意味着要完全理解TypeScript语法、类型检查和代码传输



还有一种基于闭包的方法来实现这里描述的私有方法和私有实例变量:。但这意味着您不能将任何希望访问私有方法的方法放在
定义或原型上。但是,它确实有效。

在2021年编辑:

Javascript有一个针对私有成员/方法的提案(从2021年初开始,目前处于第3阶段)。有关更多详细信息,请参见此。其中一部分是在Chrome和Nodejs中实现的,而不是在Safari和Firefox中实现的

要使用此功能,请在方法前面加上
#
,如下所示:

class ClassWithPrivateMethod {
  #privateMethod() {
    return 'hello world'
  }

  getPrivateMessage() {
    return this.#privateMethod()
  }
}
这将是不支持此功能的Javascript引擎中的语法错误


2019年的原始答案。

私人会员的工作环境

Javascript本身没有私有方法的概念。因此,如果您在一个类上定义了一个方法,那么任何引用该类实例的代码都可以调用该方法。Javascript中没有私有的方法定义

也就是说,有许多变通方法可以为您提供在私有对象上操作的代码,这些对象不能从模块外部调用。下面是一个例子:

'use strict'

// declare privateMethod as a local function that can only be called from within this module
function privateMethod(obj, args) {
   // private code here
   // reference instance with obj.method() or obj.data
   obj.otherPublicMethod()
}

module.exports = class DBConnector {
    constructor() {}
    publicMethod() {
        // call code for private method
        privateMethod(this, ...);
    }
    otherPublicMethod() {}
}
这是真正私有的,因为该方法的代码不在原型上,因此无法从该模块外部发现或调用。当然,您必须稍微不同地调用它,因为它不是一个“真正的”方法。但是,这是因为所有“真正”的方法都是可以从外部发现和调用的


如果希望私有方法本身使用
this
引用当前对象,则只需更改调用方法的方式:

'use strict'

// declare privateMethod as a local function that can only be called from within this module
function privateMethod(args) {
   // private code here
   // can reference this as in any normal method this.method() or this.data
   this.otherPublicMethod()
}

module.exports = class DBConnector {
    constructor() {}
    publicMethod() {
        // call code for private method using .call()
        privateMethod.call(this, ...);
    }
    otherPublicMethod() {}
}

仅供参考,TypeScript同时支持私有方法和属性。这是一个让你看看它是如何工作的。当然,这意味着要完全理解TypeScript语法、类型检查和代码传输


还有一种基于闭包的方法来实现这里描述的私有方法和私有实例变量:。但这意味着您不能将任何希望访问私有方法的方法放在
定义或原型上。但是,它确实有效