You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:31:04