1

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

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,但即使使用大量的例子我可以让它工作。请一些灵魂帮助我。

4

1 回答 1

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

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


Note, in addition to declaring iniparam as a shared constant, you could also make getValue() itself a module level utility function. Since it doesn't seem to access instance data, it doesn't really need to be a method. If setValue() also doesn't access instance data, it could also be a module-level utility function.

// 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;
    }
    
}
于 2021-10-30T02:45:02.793 回答