class(类)
面向对象实践 OOP 编程思想,在实际工作中,都是极其有用的抽象、封装利器。
tsx
class Person {
name: string;
say(this: Person, song: string): Person {
console.log(song);
return this;
}
constructor(name: string) {
this.name = name;
}
}
let p1 = new Person('张三');
p1.say('Song').name;
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
继承
使用extends关键字实现继承
tsx
class Male extends Person {
age: number;
constructor(name: string, age: number) {
super(name);
this.age = age;
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
修饰符
在 TypeScript 中就支持 3 种访问修饰符,分别是 public、private、protected。通过这三个修饰符做到控制属性和方法的访问。
- public:基类、子类、类外部都可以访问;
- protected:基类、子类可以访问,类外部不可以访问;
- private:基类可以访问,子类、类外部不可以访问;
- readonly:只读修饰符
tsx
class Person {
public readonly name: string = '张三';
protected age: number = 20;
private height: string = '180';
protected getPersonInfo():void {
console.log(this.name, this.age, this.height); // 基类里面三个修饰符都可以访问
}
}
class Male extends Person {
public getInfo():void {
console.log(this.name, this.age); // 子类只能访问public、protected修饰符的
}
}
let m = new Male();
console.log(m.name); // 类外部只能访问public修饰的
m.name = '李四'; // name属性使用只读修饰符,所以不能对name进行赋值修改操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
静态属性
基于静态属性的特性,往往会把与类相关的常量、不依赖实例 this 上下文的属性和方法定义为静态属性,从而避免数据冗余,进而提升运行性能。
tsx
class Person {
static title: string = "个人信息";
}
Person.title;
1
2
3
4
5
2
3
4
5
抽象类和接口
抽象类,它是一种不能被实例化仅能被子类继承的特殊类。
tsx
abstract class Person {
abstract name: string;
abstract getName(): void;
extendsFn():void {
console.log('扩展方法');
}
}
class Male extends Person {
constructor(name: string) {
super();
this.name = name;
}
name: string;
getName(): void {
console.log(this.name);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
接口interface也可以约束类的实现,使用接口与使用抽象类相比,区别在于接口只能定义类成员的类型。
tsx
interface Person {
name: string;
age: number;
getName: () => void;
}
class Male implements Person {
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
name: string;
age: number;
getName(): void {
console.log(this.name);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
类的类型
在声明类的时候,其实也同时声明了一个特殊的类型(确切地讲是一个接口类型),这个类型的名字就是类名,表示类实例的类型。
tsx
class Male {
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
name: string;
age: number;
getName(this: Male): void {
console.log(this.name);
}
}
let m1: Male = new Male("张三", 20);
let m2: Male = {
name: "张三",
age: 20,
getName(this: Male) {
console.log(this.name);
},
};
m2.getName();
let fn = m2.getName;
fn(); // 报错,this指向并不是Male对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23