NodeJS 类中的私有常量

Posted

技术标签:

【中文标题】NodeJS 类中的私有常量【英文标题】:Private const in Class NodeJS 【发布时间】:2021-12-14 23:12:23 【问题描述】:

同志们,我有一个让我无法入睡的问题,我有这个功能:

class iniparser 
constructor (path) 
    this.path = path;


#_getValue (data, param) 
    const iniparam = /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/;
    let value;

    data.toString().match(/.*?\n|.+$/g).forEach(function(line) 
        if (iniparam.test(line) && line.match(iniparam)[1] === param) 
            value = line.match(iniparam)[2];
        
    );

    return value;

然后是一些可以使用的公共方法以及所有这些...问题是 iniparam,我想将其设为私有,因为我有一个需要常量的 _setValue 方法,并且我想编写好的代码,我检查TC39 但即使使用大量的例子我也可以让它工作。请一些灵魂帮助我。

【问题讨论】:

如果这个类本身在一个模块中,那么只需在模块级别将iniparam 定义为const,因为没有特别的理由需要它是实例属性或类属性。那么类中的任何方法都可以使用它,但是只要不导出它就不能在模块外使用。未导出的模块级定义在设计上是私有的。 顺便说一句,使用#_,但不能同时使用 @jfriend00 这个。实际上,getValue 整体上也可以这样说,它不是一种方法,因为它不使用this,而应该是一个模块级函数。 @jfriend00 你的意思是在类 iniparser 之前声明它? 是的,作为class 定义之前的模块级变量。在模块级别定义常量然后在该模块中的任何地方编写代码都可以访问这些常量是很常见的。仅供参考,这与在模块中使用 importrequire 的一般概念相同。您正在初始化一个模块级常量,以便在该模块的任何地方使用。 【参考方案1】:

我的简单建议是在类定义之前定义iniparam。假设此代码位于模块中,则模块级别的变量可用于模块中的任何位置,但除此之外是私有的(除非您导出它们,否则在模块外部不可用)。

在想要使用共享常量的代码之前声明共享常量的概念在 javascript 模块中非常常见。你甚至可以说importrequire() 的做法是在做同样的事情——初始化模块中任何代码都可以使用的一些模块级常量。它甚至可以使解释器的效率更高一些,因为常量只是在模块初始化时创建/初始化一次,而不是每次调用某个函数时(尽管如果它是const,解释器可能已经为此进行了优化)。

// declare shared constants
const iniparam = /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/;

class iniparser 

    constructor (path) 
        this.path = path;
    
    
    #getValue (data, param) 
        let value;
    
        data.toString().match(/.*?\n|.+$/g).forEach(function(line) 
            if (iniparam.test(line) && line.match(iniparam)[1] === param) 
                value = line.match(iniparam)[2];
            
        );
    
        return value;
    

然后,该模块中的任何代码都可以访问该常量,但模块外的任何代码都无法访问它。


注意,除了将iniparam 声明为共享常量外,您还可以使getValue() 本身成为模块级实用函数。由于它似乎不访问实例数据,因此它实际上并不需要是一个方法。如果setValue() 也没有访问实例数据,它也可能是模块级实用函数。

// declare shared constants
const iniparam = /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/;

function getValue (data, param) 
    let value;

    data.toString().match(/.*?\n|.+$/g).forEach(function(line) 
        if (iniparam.test(line) && line.match(iniparam)[1] === param) 
            value = line.match(iniparam)[2];
        
    );

    return value;


class iniparser 

    constructor (path) 
        this.path = path;
    
    

【讨论】:

以上是关于NodeJS 类中的私有常量的主要内容,如果未能解决你的问题,请参考以下文章

如何定义常量在全局范围内nodejs

使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip

无法进入下一个中间件——NodeJS

GAE - Nodejs - 一个简单的 pubsub 应用程序的内存泄漏 - 超过了软私有内存限制

NodeJS:从同一文件中的另一个函数内部调用函数

如何使用 NodeJS 13 和 Typescript 3.8 导入 esm 模块?