Class NodeJS 中的私有常量

Private const in Class NodeJS

好的同志们,我有一个让我睡不着的问题,我有这个功能:

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;
}

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

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

这种在要使用它们的代码主体之前声明共享常量的概念在 Javascript 模块中非常常见。你甚至可以说 importrequire() 的做法是在做同样的事情——初始化模块中任何代码都可以使用的一些模块级常量。它甚至可以使解释器的效率稍微提高一些,因为在模块初始化时常量只是 created/initialized 一次,而不是每次调用某个函数时(尽管如果它是 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;
    }
    
}