# 类的定义
类是面向对象的思想,可以使用类来创建对象
# 定义基础类
使用class关键字来定义一个类
基础类分为三个部分
- 成员属性
- 成员方法
- 类的构造函数
//定义一个人的类
class people {
//定义成员属性
name: string;//姓名
age: number;//年龄
//类的构造函数
constructor(newname: string) {
this.name = newname
}
//定义成员方法
say(newname: string) {
console.log('我是' + this.name)
console.log('我是' + newname)
}
}
# 类的使用
使用类定义的成员属性和成员方法都需要实例化之后才可访问
//定义一个人的类
class people {
//定义成员属性
name: string;//姓名
age: number;//年龄
//类的构造函数
constructor(newname: string) {
this.name = newname
}
//定义成员方法
say(newname: string) {
console.log('我是' + this.name)
console.log('我是' + newname)
}
}
//类的使用
const newpeople = new people('张三')
//访问类中的成员
console.log(newpeople.name)
console.log(newpeople.age)
newpeople.say('哈哈')
# static关键字
使用static关键字可以定义静态属性/类属性
# 成员属性的静态属性的区别
在成员属性或方法需要通过实例化类才可访问,但静态属性可通过类直接访问,实例化后无法访问
class people {
//定义成员属性
name: string;//姓名
static age: number;//定义静态属性
//定义静态方法
static say(text: string) {
console.log(text)
}
}
//静态属性的访问
console.log(people.age)
people.say('哈哈')
# readonly关键字
在成员属性或方法前加readonly表示这个属性是只读的,不可更改
class people {
//定义成员属性
name: string;//姓名
readonly age: number;//定义只读
readonly static sex: '男' | '女';//静态的只读属性
}
# 构造函数和this
constructor被称为构造函数,它会在对象被创建的时候调用
在构造函数中可以通过this向类中添加属性值
class dog {
name: string;
age: number;
//定义构造函数
constructor(newname: string, newage: number) {
//在构造函数中this就表示当前实例
this.name = newname
this.age = newage
}
}
//实例化时传入对应属性
const newdog = new dog('小黑', 2)
const newdog1 = new dog('小白', 3)
# 类的继承
多个class继承 避免编写重复代码
//定义一个表示狗的类
class dog {
name: string;
age: number;
//定义构造函数
constructor(newname: string, newage: number) {
//在构造函数中this就表示当前实例
this.name = newname
this.age = newage
}
sey() {
console.log('汪汪汪')
}
}
//定义一个表示猫的类
class cat {
name: string;
age: number;
//定义构造函数
constructor(newname: string, newage: number) {
//在构造函数中this就表示当前实例
this.name = newname
this.age = newage
}
sey() {
console.log('喵喵')
}
}
为解决两个class重复代码问题,需把公共的重复代码提取出来
//定义一个公共的动物类 提取相同代码
class animal {
name: string;
age: number;
//定义构造函数
constructor(newname: string, newage: number) {
//在构造函数中this就表示当前实例
this.name = newname
this.age = newage
}
sey() {
console.log('动物在叫')
}
}
//使用继承定义表示狗的类
class dog extends animal {
run() {
console.log(this.name + '在跑')
}
}
//使用继承定义表示猫的类
class cat extends animal {
//子类方法重写
sey() {
console.log('喵喵喵')
}
}
- 此时animal类被称为父类,dog和cat被称为子类
- 通过继承可以将多个子类的代码写在父类中,这样就可以让所有的子类同时拥有父类中的属性和方法
- 如果想要在子类中添加父类所没有的属性和方法时直接写在子类中就行
- 如果在子类中添加了和父类相同的方法,则子类方法会覆盖掉父类的方法 方法重写
# super关键字
super表示父类,使用super关键字可以调用父类的属性和方法
//定义一个公共的动物类 提取相同代码
class animal {
name: string;
age: number;
//定义构造函数
constructor(newname: string, newage: number) {
//在构造函数中this就表示当前实例
this.name = newname
this.age = newage
}
sey() {
console.log('动物在叫')
}
}
//定义一个子类
class cat extends animal {
constructor() {
//如果子类中写了构造函数,在子类的构造函数中必须调用`super`方法
super();
}
sey() {
//super关键字表示父类
super.sey()
}
}
# 抽象类
对于父类,有时我们并不希望父类被用于创建对象,而是被其他子类继承
以abstract开头的类为抽象类
抽象类和其他类区别不大 只是不能用于创建对象
抽象类就是专门用来继承的类
//抽象类的定义
abstract class animal {
name: string;
age: number;
//定义构造函数
constructor(newname: string, newage: number) {
//在构造函数中this就表示当前实例
this.name = newname
this.age = newage
}
sey() {
console.log('动物在叫')
}
}
# 抽象类中可以添加抽象方法
抽象方法以abstract开头
抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
//抽象类的定义
abstract class animal {
name: string;
age: number;
//定义构造函数
constructor(newname: string, newage: number) {
//在构造函数中this就表示当前实例
this.name = newname
this.age = newage
}
//定义抽象方法
abstract sey(): void;
}
class dog extends animal {
//抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
sey() {
console.log('汪汪汪')
}
}