模式切换
类
在 TypeScript 中,类(Class)是一种面向对象编程的构造,它提供了一种组织代码的方式,通过封装数据(属性)和功能(方法)来创建可重用的对象。类可以包含属性(成员变量)、方法(成员函数)、构造函数和访问修饰符等。
定义类
typescript
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter = new Greeter("world");
console.log(greeter.greet()); // 输出 "Hello, world"
访问修饰符
- public:默认修饰符,属性或方法在任何地方都可以被访问。
- private:属性或方法只能在类内部被访问。
- protected:属性或方法可以在类内部和子类中被访问。
- readonly:属性只能被初始化一次,然后就不能被修改了。
typescript
class Animal {
private name: string;
constructor(theName: string) {
this.name = theName;
}
public move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) {
super(name); // 调用父类的构造函数
}
public move() {
console.log("Slithering...");
super.move(5); // 调用父类的move方法
}
}
let snake = new Snake("Dangerous Snake");
snake.move(); // 输出 "Slithering..." 和 "Dangerous Snake moved 5m."
抽象类
抽象类不能被实例化,它通常包含抽象方法,这些方法必须在任何子类中实现。
typescript
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log("The animal moves.");
}
}
class Dog extends Animal {
makeSound(): void {
console.log("The dog barks.");
}
}
let d = new Dog();
d.move(); // 输出 "The animal moves."
d.makeSound(); // 输出 "The dog barks."
静态成员
类可以包含静态成员,这些成员与类本身关联,而不是与类的任何实例关联。
typescript
class Grid {
static origin = {x: 0, y: 0};
calculateDistanceFromOrigin(point: { x: number, y: number }) {
let dx = point.x - Grid.origin.x;
let dy = point.y - Grid.origin.y;
return Math.sqrt(dx * dx + dy * dy) / this.scale;
}
constructor(public scale: number) {
}
}
let grid1 = new Grid(1.0); // 1x scale
let grid2 = new Grid(5.0); // 5x scale
console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10})); // 输出 14.142135623730951
console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10})); // 输出 70.71067811865476
类的继承
类可以继承自其他类,继承允许你重用代码,并且添加或覆盖功能。
typescript
class Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}
move(): void {
console.log(`${this.name} moves.`);
}
}
class Snake extends Animal {
constructor(name: string) {
super(name);
}
move(): void {
console.log("Slithering...");
}
eat(): void {
console.log(`${this.name} eats a mouse.`);
}
}
let s = new Snake("Dangerous Snake");
s.move(); // 输出 "Slithering..."
s.eat(); // 输出 "Dangerous Snake eats a mouse."