Node.js类中私有常量定义实现问题求助
嘿,我太懂这种想把代码写得更规范却卡壳的感觉了!你想把iniparam这个正则常量改成类的私有成员,让多个私有方法共享,其实用ES6的私有类字段就能轻松解决,我给你调整下代码:
修改后的完整代码
class iniparser { // 把正则定义为私有静态字段,类的所有实例共享,且外部无法访问 static #iniparam = /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/; constructor (path) { this.path = path; } #_getValue (data, param) { let value; data.toString().match(/.*?\n|.+$/g).forEach(function(line) { // 直接通过类名访问私有静态字段 if (iniparser.#iniparam.test(line) && line.match(iniparser.#iniparam)[1] === param) { value = line.match(iniparser.#iniparam)[2]; } }); return value; } // 比如你的#_setValue方法,现在也能复用这个私有正则了 #_setValue(data, param, newValue) { const regex = new RegExp(`^\\s*${param}\\s*=\\s*.+`, 'gm'); return data.toString().replace(regex, `${param}=${newValue}`); // 如果需要更严谨的匹配,也可以基于#iniparam扩展键的匹配逻辑 } }
关键说明
- 私有静态字段的优势:用
static #iniparam定义,意味着这个正则是类级别的,所有实例共享同一份,既节省内存又保证了私有性——外部代码完全无法访问这个字段,符合你要的规范要求。 - 访问方式:在类的私有方法里,直接用
iniparser.#iniparam就能访问这个静态私有字段;如果考虑继承场景,也可以用this.constructor.#iniparam,效果一致。 - 实例私有字段的备选方案:如果你有特殊需求要每个实例拥有独立的正则实例(虽然这里完全没必要),可以去掉
static,改成实例私有字段:
然后在方法里用#iniparam = /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/;this.#iniparam访问即可。
另外要注意:私有字段必须在类的顶层直接声明,不能在方法内部定义,而且#是语法的一部分,不能省略,这也是TC39规范里明确的私有成员写法。
内容的提问来源于stack exchange,提问作者Valentino Zaffrani
相关产品推荐
相关产品推荐

