# 属性与方法
在面向对象语言中,类是创建对象的蓝图,描述了所创建的对象共同的属性和方法。
代码语言:javascript复制class Greeter {
// 静态属性
static cname: string = 'Greeter';
// 成员属性
greeting: string;
// 构造函数 - 执行初始化操作
constructor(message: string) {
this.greeting = message;
}
// 静态方法
static getClassName() {
return 'Class name is ' Greeter.cname;
}
// 成员方法
greet() {
return 'Hello, ' this.greeting;
}
}
let greeter = new Greeter('Cell');
// "use strict";
// class Greeter {
// // 构造函数 - 执行初始化操作
// constructor(message) {
// this.greeting = message;
// }
// // 静态方法
// static getClassName() {
// return 'Class name is ' Greeter.cname;
// }
// // 成员方法
// greet() {
// return 'Hello, ' this.greeting;
// }
// }
// // 静态属性
// Greeter.cname = 'Greeter';
// let greeter = new Greeter('Cell');
# ES 私有字段
代码语言:javascript复制class Greeter {
#name: string;
constructor(name: string) {
this.#name = name;
}
greet() {
return `Hello, my name is ${this.#name}.`;
}
}
let greeter = new Greeter('Cell');
greet.#name; // Error - 私有字段只能在类内部访问
私有字段的一些规则:
- 私有字段以
#
开头 - 每个私有字段名称都唯一地限定于其包含的类
- 不能在私有字段上使用 TypeScript 访问修饰符(
public
或private
) - 私有字段不能在包含的类之外访问,甚至不能被检测到
# 访问器
通过 getter
和 setter
方法来实现数据的封装和有效性校验,防止出现异常数据。
let password = "Cellinlab";
class Employee {
private _fullName: string = '';
get fullName(): string {
return this._fullName;
}
set fullName(newName: string) {
if (password && password == "Cellinlab") {
this._fullName = newName;
} else {
console.log("Error: Unauthorized update of employee!");
}
}
}
let employee = new Employee();
employee.fullName = "Cell";
if (employee.fullName) {
console.log(employee.fullName);
}
# 继承
继承是一种联结类与类的层次模型。指一个类(子类、子接口)继承另一个类(父类、父接口)的属性和方法,并可以增加自己的属性和方法。
代码语言:javascript复制class Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) {
super(name); // 调用父类的构造函数
}
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
class Horse extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 45) {
console.log("Galloping...");
super.move(distanceInMeters);
}
}
let s = new Snake("sss");
s.move(); // Slithering... sss moved 5m.
let h = new Horse("hhh");
h.move(34); // Galloping... hhh moved 34m.
# 抽象类
抽象类不能被实例化,因为它里面包含一个或多个抽象方法(抽象方法指没有具体实现的方法)。
代码语言:javascript复制abstract class Person {
constructor(public name: string) {}
abstract say(words: string): void;
}
const p = new Person('Cell'); // Error: Cannot create an instance of an abstract class.
只能实例化实现了所有抽象方法的子类。
代码语言:javascript复制abstract class Person {
constructor(public name: string) {}
abstract say(words: string): void;
}
class Developer extends Person {
constructor(name: string) {
super(name);
}
say(words: string): void {
console.log(`${this.name} say: ${words}`);
}
}
const p = new Developer('Cell');
p.say('Hello, TypeScript!'); // Cell say: Hello, TypeScript!
# 类方法重载
代码语言:javascript复制class ProductService {
getProducts(): void;
getProducts(id: number): void;
getProducts(id?: number): void {
if (typeof id === 'number') {
console.log(`Get product by id: ${id}`);
} else {
console.log('Get all products');
}
}
}
const productService = new ProductService();
productService.getProducts(); // Get all products
productService.getProducts(1); // Get product by id: 1