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

JavaScript ES6私有延迟函数编写问题:权限类遇语法与运行错误求助

解决ES6私有延迟函数的语法问题

我想在ES6类中实现一个延迟100ms的私有类函数,但始终没搞对语法。以下是一个权限检查类,私有数组#permissions用于缓存权限结果,仅对外暴露has方法,接收字符串参数并校验用户是否拥有对应权限:

class Permission {
  #permissions = [];

  #started = false;

  async init() {
    this.#started = true;
    const res = await axios.get('/user/permissions');
    this.#permissions = res.data.permissions;
    this.#started = false;
  }

  static #delay(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  async has(perm) {
    while (!this.#permissions.length) {
      if (!this.#started) {
        this.init();
      }
      await this.#delay(100);
    }
    return this.#permissions.includes(perm);
  }
}

尝试两种方案后都遇到了问题:

  • 移除static关键字时,代码检查工具提示该函数未使用this,应设为静态函数;
  • 保留static关键字时,代码检查无提示,但运行时报错:TypeError: 接收者必须是Permission类

问题原因

私有静态方法必须通过类本身调用,而不能通过类的实例(this)调用。你在实例方法has里用this.#delay()调用私有静态方法,违反了这个规则,导致运行时错误。

两种可行解决方案

方案1:改为实例私有方法

忽略代码检查的提示(提示只是风格建议,并非语法错误),把#delay改成实例私有方法,调用方式无需修改:

class Permission {
  #permissions = [];
  #started = false;

  async init() {
    this.#started = true;
    const res = await axios.get('/user/permissions');
    this.#permissions = res.data.permissions;
    this.#started = false;
  }

  // 移除static,改为实例私有方法
  #delay(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  async has(perm) {
    while (!this.#permissions.length) {
      if (!this.#started) {
        this.init();
      }
      await this.#delay(100);
    }
    return this.#permissions.includes(perm);
  }
}

方案2:保留静态私有方法,修改调用方式

如果想保留static关键字,调用时直接通过类名Permission.#delay()来调用,而不是用this:

class Permission {
  #permissions = [];
  #started = false;

  async init() {
    this.#started = true;
    const res = await axios.get('/user/permissions');
    this.#permissions = res.data.permissions;
    this.#started = false;
  }

  static #delay(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  async has(perm) {
    while (!this.#permissions.length) {
      if (!this.#started) {
        this.init();
      }
      // 通过类名调用私有静态方法
      await Permission.#delay(100);
    }
    return this.#permissions.includes(perm);
  }
}

补充说明

代码检查工具的提示是基于“未使用this的方法建议设为静态”的规则,但实例私有方法完全可以不依赖this。两种方案都合法:如果#delay是和实例无关的通用工具函数,选静态私有方法更合适;如果希望方法和实例绑定,用实例私有方法也没问题。

内容的提问来源于stack exchange,提问作者mankowitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:10:24