TypeScript:static静态属性(静态变量)

介绍

在类中,使用 static 关键字修饰的 属性(成员变量),称为 静态变量(类变量,类属性)

静态变量在类的 所有实例之间共享

应用场景

  • 同一型号手机的 配置 都是相同的,但每台手机的 热点名、app、手机号是不同的

  • 对象之间共享数据

特性

静态成员属于类本身,而不是类的任何实例。

例子

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() 方法遍历显示联系人

创建两个手机对象,一个手机添加联系人,另一个手机就可以显示该联系人,实现了数据共享

定义类

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 ❌ 不能(因为没有实例) ✅ 能

示例对比

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"

}

静态成员可以被继承

    class Parent {
      static parentStatic = "I'm static in Parent";
    }

    class Child extends Parent {
      // Child 类也拥有 parentStatic
    }

    console.log(Child.parentStatic); // "I'm static in Parent"

可以有同名的静态和实例成员

可以有同名的静态和实例成员,但它们是完全独立的。

    class Confusing {
      static name = "Static Name";
      name = "Instance Name"; // 这是允许的,但容易混淆,不推荐
    }

访问修饰符

静态成员也可以使用 public (默认), private, protected。

*   `private static`: 只能在类内部访问。
*   `protected static`: 可以在类及其子类内部访问。

总结

  • static 关键字用于定义属于类本身的成员。
  • 通过 ClassName.member 访问静态成员。
  • 静态成员在所有实例间共享,只有一份。
  • 常用于:常量、单例模式、共享数据。

原文出处:/show_1GW21sgKel8g.html