TS-11 面向对象-class 下

  • 成员可见性:
  1. public:类外可见(默认就是public),类内及子类也都可访问
  2. private:仅类内可见,this.xxx,但类型擦除后,如果人家用js引用,还是可以访问,因此ts提供了#var作为真正的私有属性
  3. protected:类内及子类可见,类似于整个家族类可见
class Person {
  friend?: Person // 默认是public
  protected gender = 'male'
  private height = 170
  public weight = 70
  #age = 20 // 真正的私有属性(private)
  constructor(public name:string,friend?:Person){
    this.friend = friend
    this.name = name
    this.#age = 20
  }
  sayHi(){
    console.log(this.name)
  }
  getHeight(){
    console.log(this.height)
    console.log(this.name)
    console.log(this.gender)
  }
}

const p = new Person('frank')
p.sayHi()
p.getHeight()

class User extends Person{
  declare friend?: User
  constructor(name:string,friend?:User){
    super(name,friend)
  }
  test(){
    console.log(`---${this.gender}---`)
    console.log(`---${this.weight}---`)
    // 不能访问 this.height
  }
}

const u1 = new User('mike')
u1.test()
u1.weight
// 不能访问 u1.gender 以及 u1.height 
  • static:静态属性,就是类自身的属性,类似于原型中的共有属性的概念
class Student {
  static grade = 7  // 可修改
  static readonly tag = '' // 不能修改
}

Student.grade = 8
  • 注意点:静态属性不能声明name,因为class在js中就是函数class A {}; typeof A === 'function',而所有的函数都有name属性
  • 类和泛型
class Hash<K,V> extends Map<K,V> {
  destroy(){
    this.clear() // 继承自Map类的方法
  }
}
  • 匿名类
  • abstract:抽象类,可以不实现一部分属性。不能创建实例
  • 把类当做参数:
class Person {
  constructor(public name:string){}
}

function f(X:typeof Person){
  const p = new X('frank')
  console.log(p.name)
}

f(Person)

// 这不是箭头函数,箭头函数是不能加 new 的
function f2(X: new (name:string) => Person){
  const p = new X('ricky')
  console.log(p.name)
}

f2(Person)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容