静态属性属于类本身,内存中仅一份,通过类名访问,适用于常量等全局数据;实例属性属于每个对象,每次new独立创建,通过实例访问,用于个体状态。

ES6 中静态属性和实例属性本质不同,关键不在语法糖,而在归属对象和内存模型。
静态属性:属于类本身,一份共享
静态属性直接挂载在类(函数对象)上,不是每个实例都有一份。它只在内存中存一份,所有调用都指向同一处。
- 定义方式:ES6 原生不支持
static prop = value写法,需类外赋值,例如MyClass.VERSION = '1.0' - 访问方式:只能通过
MyClass.VERSION,不能通过new MyClass().VERSION - 适用场景:常量、配置项、工具数据(如 API 版本号、默认超时时间)
实例属性:属于每个对象,各自独立
实例属性绑定在 this 上,每次 new 都新建一份,互不影响。
- 定义方式:可在
constructor中赋值(this.name = 'xxx'),也可用类字段语法(name = 'xxx',需 Babel 或现代环境支持) - 访问方式:仅能通过实例访问,如
const inst = new MyClass(); inst.name - 适用场景:描述个体状态(如用户姓名、计数器当前值)
为什么内存分配差异重要
静态属性节省内存,适合全局不变的数据;实例属性保障隔离性,避免多个实例意外共享状态。
- 若误把用户 ID 存成静态属性,所有实例会共用同一个 ID
- 若把 API 基础 URL 设为实例属性,每个实例都重复存一遍,浪费空间
- 子类可继承父类静态属性,但无法继承父类的实例属性(除非显式调用
super()并赋值)
兼容写法与注意事项
类字段提案(含 static prop = value)已进入 Stage 4,但非所有环境原生支持。生产项目建议:
- 静态属性优先用类外赋值,明确、兼容、无歧义
- 实例属性可用类字段语法,提升可读性,但需确认构建工具支持
- 避免在静态方法中修改实例属性(
this.xxx),此时this指向类,不是实例











