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
相关产品推荐
相关产品推荐

