TypeScript:static静态属性(静态变量) 作者:马育民 • 2025-10-12 19:21 • 阅读:10002 # 介绍 在类中,使用 `static` 关键字修饰的 **属性(成员变量)**,称为 **静态变量(类变量,类属性)** 静态变量在类的 **所有实例之间共享** ### 应用场景 - 同一型号手机的 **配置** 都是相同的,但每台手机的 **热点名**、app、手机号是不同的 - 对象之间共享数据 ### 特性 静态成员属于**类本身**,而不是类的**任何实例**。 # 例子 ```typescript class Mate80 { // 静态属性 static type:string = "华为Mate80" // 热点名,实例属性 wifiName:string = "" } ``` ### 访问静态属性 使用 类名.成员名 ``` console.log("Mate80的名字:",Mate80.type) ``` ### 不能通过实例访问静态成员 ``` let lileiMate80 = new Mate80() // 执行报错 console.log("Mate80的名字:",lileiMate80.type) ``` ### 修改静态属性 ``` Mate80.type = "华为Mate80升级款" console.log("Mate80的名字:",Mate80.type) ``` # 例子:对象之间共享数据 在 **Mate80类** 中定义 **静态属性 联系人**,创建2个方法: - `add()` 方法添加联系人 - `show()` 方法遍历显示联系人 创建两个手机对象,一个手机添加联系人,另一个手机就可以显示该联系人,实现了数据共享 ### 定义类 ```typescript class Mate80 { // 联系人,静态属性 static contact:string[] = [] // 添加联系人 add(name:string):void{ Mate80.contact.push(name) } // 显示联系人 show():void{ for(let item of Mate80.contact){ console.log(item) } } } ``` ### 创建对象、添加联系人 ``` let lileiMate80 = new Mate80() // 李雷在他的手机添加了lili lileiMate80.add("lili") ``` ### 创建对象、显示联系人 ``` let hmmMate80 = new Mate80() // 韩梅梅的手机上就有了lili,实现共享数据 hmmMate80.show() ``` # 静态成员 vs 实例成员 | 特性 | 静态成员 (Static) | 实例成员 (Instance) | | :--- | :--- | :--- | | **所属** | 属于**类** | 属于**类的每个实例** | | **关键字** | `static` | 无 (`public`, `private`, `protected` 可修饰两者) | | **访问方式** | `ClassName.member` | `instance.member` | | **内存** | 只有一份,所有实例**共享** | 每个实例都有一份独立的副本 | | **初始化时机** | 类加载时(程序启动时) | 实例创建时 (`new`) | | **能否访问 `this`** | ❌ 不能(因为没有实例) | ✅ 能 | ### 示例对比 ```typescript class Mate80 { // 静态属性 static type:string = "华为Mate80" // 热点名,实例属性 wifiName:string = "" } let lileiMate80 = new Mate80() // 修改实例属性,需要通过 对象名.属性名 lileiMate80.wifiName = "李雷的mate80" let hmmMate80 = new Mate80() // 修改实例属性,需要通过 对象名.属性名 hmmMate80.wifiName = "韩梅梅的mate80" // 修改静态属性,需要通过 类名.静态属性名 Mate80.type = "华为Mate80升级款" // 访问静态属性,需要通过 类名.静态属性名 console.log("Mate80的名字:",Mate80.type) // 访问对象属性,需要通过 对象名.属性名 console.log("lilei的热点名:",lileiMate80.wifiName) // 访问对象属性,需要通过 对象名.属性名 console.log("韩梅梅的热点名:",hmmMate80.wifiName) ``` # 注意:不能用静态属性name 类中默认内置 静态属性 `name`,所以不能再定义 静态属性 `name` ``` class Mate80 { // 下行代码报错 static name:string = "华为Mate80" } ``` # 静态成员可以被继承 ```typescript class Parent { static parentStatic = "I'm static in Parent"; } class Child extends Parent { // Child 类也拥有 parentStatic } console.log(Child.parentStatic); // "I'm static in Parent" ``` # 可以有同名的静态和实例成员 可以有同名的静态和实例成员,但它们是完全独立的。 ```typescript class Confusing { static name = "Static Name"; name = "Instance Name"; // 这是允许的,但容易混淆,不推荐 } ``` # 访问修饰符 静态成员也可以使用 `public` (默认), `private`, `protected`。 * `private static`: 只能在类内部访问。 * `protected static`: 可以在类及其子类内部访问。 # 总结 * **`static` 关键字**用于定义属于**类本身**的成员。 * 通过 **`ClassName.member`** 访问静态成员。 * 静态成员在所有实例间**共享**,只有一份。 * 常用于:**常量、单例模式、共享数据**。 原文出处:http://malaoshi.top/show_1GW21sgKel8g.html