1. 使用关键字class定义一个类
class Person { }
2. 定义类中的实例属性
通过new调用产生的实例对象可以访问
class Person{
name:string = '名字'
age:number = 18
}
const per = new Person()
console.log(per.name)
3. static 类属性/静态属性
通过【类名.属性名】访问,使用关键字static修饰,不需要创建实例使用,实例对象读取不到
class Person{
name:string = '名字'
static age:number = 18
}
const per = new Person()
console.log(per.name, Person.age)
4. readonly 只读属性
class Person{
readonly name:string = '名字'
static readonly age:number = 18
}
5. 定义方法
实例方法中的this表示当前调用方法的对象
class Person{
say123(){ console.log(123)
static say456(){ console.log(123)
}
const per = new Person()
per.say123()
Person.say456()
6. constructor 构造函数
构造函数在对象创建(new调用)时调用,函数中的this表示当前新建的实例对象
class Person{
name:string
age:number
constructor(name:string, age:number){
this.name = name
this.age = age
}
}
const ming = new Person('小明', 16)
const fang = new Person('小芳', 18)
7. extends 继承
class 子类 extends 父类 { }
使用继承后,子类将会拥有父类的所有方法和属性;通过继承,我们可以将多个类中共有的代码写在一个父类中,这样只需要写一次即可让所有子类都同时拥有父类中的属性和方法
若想在子类中添加独有的属性或方法,直接写即可。如果在子类中添加了父类中同名方法,则子类方法会覆盖掉父类中的方法,我们称之为方法重写。
class Animal{
name:string
age:number
constructor(name:string, age:number){
this.name = name
this.age = age
}
sayHi(){
console.log('动物再叫!')
}
}
class Dog extends Animal{
run(){
console.log(this.name+'在跑~')
}
}
class Cat extends Animal{
}
const cat = new Cat('小猫', 2)
const dog = new Dog('小狗', 3)
dog.run()
// cat.run() //报错
cat.sayHi()
在子类方法中引用父类方法,用super关键字表示当前类的父类
class Dog extends Animal {
sayHi(){ super.sayHi() }
}
如果在子类中写了constructor构造函数,需要在子类构造函数中对父类的构造函数进行调用,super()
class Animal{
name:string
constructor(name:string){ this.name = name }
}
class Dog extends Animal{
age:number
constructor(name:string, age:number){
super(name)
this.age = age
}
}
8. abstract 抽象类
以abstract关键字开头的类是抽象类,是专门用来继承的类,不能用来创建对象
抽象类中可以添加抽象方法,只定义结构,不定义具体实现。抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
abstract class Animal{
name:string
constructor(name:string){
this.name = name
}
abstract sayHi():void
}
class Dog extends Animal{
sayHi(): void { ... }
}
9. 属性修饰符public/private/protected
可以在属性前添加属性修饰符,用来对属性做限制,这是ts独有的,js会忽略
public 修饰的属性可以在任意位置访问、修改,是默认值,不写即为public
private 私有属性,只能在类内部进行访问、修改,继承了此类的子类也不能用
protected 受保护的属性,只能在当前类和当前类的子类中可以访问、修改
class Person{
public name:string
private age:number
constructor(name:string, age:number){
this.name = name
this.age = age
}
}
const p = new Person('小明', 18)
p.name = '小红'
// p.age = 19 // 报错age是私有属性,只能在类Person中使用
我们可以通过添加方法使得私有属性可以被外部访问、修改
class Person{
private age:number
constructor(age:number){
this.age = age
}
//定义方法,用来获取年龄
getAge(){ return this.age }
//定义方法,修改年龄
setAge(value:number){ //自定义修改方法,可以对value值做判断处理 }
}
const p = new Person('小明', 18)
console.log(p.getAge())
p.setAge(18)
以上方法使用时需要 p.getAge() p.setAge(18),改变了我们平时的使用习惯,在ts中可以如下设置
class Person{
private _name:string
constructor(name:string){
this._name = name
}
get name(){ return this._name }
set name(value:string){ this._name = value}
}
const p = new Person('小明')
p.name = '小红'
简便写法:
class Person{
constructor(public name:string, private age:number, protected gender:string){
}
}
const p = new Person('小明', 18, '男')