类静态属性不是全局变量但可替代其部分用途,它通过模块作用域限制访问、配合export实现数据共享与隔离,避免污染全局命名空间。

类静态属性本身不是全局变量,但它能替代部分全局变量的用途——关键在于控制作用域和访问方式。用得好,它既保持数据共享性,又避免直接挂载到 window 或污染全局命名空间。
静态属性天然限制作作用域
在 JavaScript(ES6+)中,class 的 static 属性属于类本身,不依赖实例,但它的可见性仅限于该类定义所在的模块作用域(尤其配合 export 时)。这和直接声明 const globalCache = new Map() 有本质区别:
- 前者:只在导入该类的模块里可访问,其他模块不感知;
- 后者:一旦声明在顶层,就自动成为全局对象属性(浏览器中即
window.globalCache),哪怕没显式赋值给window。
用静态属性做缓存的典型写法
以一个工具类为例,把缓存逻辑封装在类内部,对外只暴露方法:
class DataFetcher {<br> static cache = new Map(); // 私有缓存容器<br> static get(url) {<br> if (this.cache.has(url)) return this.cache.get(url);<br> const data = /* 实际请求 */;<br> this.cache.set(url, data);<br> return data;<br> }<br>}调用时只需 DataFetcher.get('/api/user'),无需暴露 cache 给外部操作,也不需要把它放到全局变量里供多个文件引用。
配合模块导出,彻底隔离全局
如果这个类定义在 fetcher.js 中,并通过 export default DataFetcher 导出:
- 其他模块必须显式
import DataFetcher from './fetcher.js'才能使用; - 即使多个模块导入同一个类,它们共享的是同一份
static cache,但不会泄漏到全局作用域; - 没有
import的脚本完全无法访问该缓存,更不可能误改或覆盖。
对比传统全局缓存的风险点
若不用类而直接写:const CACHE = new Map(); 放在模块顶层:
- 在非模块环境(如 script 标签直连)中,它会变成
window.CACHE; - 即使在模块中,若某处不小心漏写
const(如CACHE = new Map()),就会隐式创建全局变量; - 所有导入该模块的地方都能随意修改
CACHE,缺乏访问控制。
而静态属性 + 模块化,从语法层和运行时双重约束了污染可能。










