第5章:类与面向对象编程
构造函数与属性初始化
1. 构造函数的基本概念
在 TypeScript 中,构造函数(constructor)是类的特殊方法,用于在创建类的实例时初始化对象。构造函数会在使用 new 关键字实例化类时自动调用。
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
const person = new Person("Alice", 30);
2. 构造函数的参数属性
TypeScript 提供了一种简化的语法,允许直接在构造函数参数中声明和初始化属性,称为参数属性。通过在参数前添加访问修饰符(public、private、protected),可以省略手动赋值。
class Person {
constructor(public name: string, public age: number) {}
}
// 等价于:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
3. 属性初始化方式
类的属性可以通过以下方式初始化:
- 构造函数初始化:在构造函数中赋值(如上例)。
- 默认值初始化:直接在属性声明时赋值。
- 延迟初始化:使用
!断言(明确告诉 TypeScript 属性会在稍后初始化)。
class Example {
// 默认值初始化
count: number = 0;
// 延迟初始化
message!: string;
constructor() {
this.message = "Hello"; // 实际初始化
}
}
4. 静态属性与实例属性
- 实例属性:属于类的每个实例,通过
this访问。 - 静态属性:属于类本身,通过类名访问,用
static关键字声明。
class Circle {
static PI: number = 3.14; // 静态属性
radius: number; // 实例属性
constructor(radius: number) {
this.radius = radius;
}
getArea(): number {
return Circle.PI * this.radius ** 2;
}
}
console.log(Circle.PI); // 3.14
const circle = new Circle(5);
console.log(circle.getArea()); // 78.5
5. 初始化顺序
类属性的初始化顺序如下:
- 静态属性(如果未显式初始化,则为
undefined)。 - 实例属性(按声明顺序初始化默认值)。
- 构造函数中的赋值。
class InitOrder {
static staticField = console.log("1. Static field");
instanceField = console.log("2. Instance field");
constructor() {
console.log("3. Constructor");
}
}
new InitOrder();
// 输出顺序:
// 1. Static field
// 2. Instance field
// 3. Constructor
6. 实际应用建议
- 优先使用参数属性简化代码。
- 避免滥用
!断言,确保属性确实会被初始化。 - 对于可选属性,可以使用
?或联合类型(如string | undefined)。
class User {
constructor(
public id: string,
public name: string,
public age?: number // 可选属性
) {}
}
