JS类调用#前缀私有方法报Invalid or unexpected token错误咨询
JS类#前缀私有方法报「Invalid or unexpected token」错误解决方案
核心结论
你代码中私有方法的定义、类内部调用写法完全符合ES2022正式规范,抛出语法错误的唯一原因是当前运行代码的环境(Node.js/浏览器)版本过低,不支持原生类私有成员语法,JS解析器遇到#标记时无法识别,直接抛出语法异常。
JavaScript #前缀私有成员的正确访问规则
- 私有属性/方法必须在类定义体内用
#前缀声明,不允许在类外部给实例动态添加#开头的私有成员 - 私有成员仅能在定义该成员的类的内部访问,类实例、继承的子类都无法从外部直接访问私有成员
- 类内部访问私有成员时,必须使用
this.#成员名的格式,你代码中this.#calcularArea()的写法是正确的。
代码有效性验证
你提供的代码在支持ES2022类私有特性的环境中可以正常运行,执行结果如下:
class Poligono{ constructor(altura, largura){ this.altura = altura this.largura = largura } get area(){ return this.#calcularArea() } #calcularArea() { return this.altura * this.largura } } let var_poligono = new Poligono(50, 60) console.log(var_poligono) // 输出 Poligono { altura: 50, largura: 60 } console.log(var_poligono.area) // 输出 3000 // 外部直接调用var_poligono.#calcularArea()会抛错,符合私有成员的访问限制
对应解决方法
- 优先升级运行环境:Node.js升级到14.6.0及以上的LTS稳定版本,升级后无需额外配置即可直接运行你的代码;12.x版本的Node.js需要启动时增加
--harmony-private-fields参数才能开启该特性支持,不推荐使用。 - 浏览器环境下确认版本兼容:Chrome 74+、Firefox 90+、Safari 14.1+已原生支持该语法,如果需要兼容更低版本浏览器,引入Babel对代码进行转译即可。
- 如果暂时无法升级环境,可以替换为社区通用的下划线约定写法:用
_前缀标识方法为内部私有,注意这种写法只是约定层面的私有,外部依然可以访问到,不存在语法层面的强制限制,示例修改:
class Poligono{ constructor(altura, largura){ this.altura = altura this.largura = largura } get area(){ // 下划线前缀调用 return this._calcularArea() } // 下划线前缀标识内部方法 _calcularArea() { return this.altura * this.largura } } let var_poligono = new Poligono(50, 60) console.log(var_poligono)
内容的提问来源于stack exchange,提问作者Wesley Alexsander
相关产品推荐
相关产品推荐

