-
public
:类外可见(默认就是public
),类内及子类也都可访问
-
private
:仅类内可见,this.xxx,但类型擦除后,如果人家用js引用,还是可以访问,因此ts提供了#var
作为真正的私有属性
-
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)