基本類
new實(shí)例化類時摘昌,會創(chuàng)建一個Animal類型的新對象,并執(zhí)行constructor初始化它:
class Animal {
? ? char: string; // 測處為分號不是逗號
? ? constructor (msg: string) {
? ? ? ? this.char = msg;
????}
? ? say() {
? ? ? ? return `hello ${this.char}`
????}
};
let myAn = new Animal('dog');
繼承
允許使用繼承來擴(kuò)展現(xiàn)有的類,通過extends關(guān)鍵字:
class Animal {
? ? move(len: number = 0) {
? ? ? ? console.log(`animal moved ${len} m`)
????}
}
class Dog extends Animal {
? ? bark() {
? ? ? ? console.log('wof, wof');
????}
}
const dog = new Dog();
dog.bark(); // Dog類本身的方法
dog.move(10); //從Animal類繼承來的方法
注釋:此例子中,Dog類是一個派生類,它派生自Animal基類迈螟,派生類被稱作 子類叉抡,基類被稱作 超類。
在子類里重寫父類的方法
class Animal {
? ? name: string,
? ? constructor(theName: string) {this.name = theName;}
? ? move(len: number = 0) {
? ? ? ? console.log(`${this.name} moved ${len}m.`);
????}
}
class Snake extends Animal {
? ? constructor(name: string) { super(name); }
? ? move(len = 5) {
? ? ? ? console.log("Slithering...");
? ? ? ? super.move(len);
????}
}
class Horse extends Animal {
? ? constructor(name: string) {super(name);}
? ? move(len = 45) {
? ? ? ? console.log("Galloping...")
? ? ? ? super.move(len);
????}
}
let sam = new Snake("Sammy");
let tom:Animal = new Horse("Tommy");
sam.move();
tom.move(34);
輸出結(jié)果:Slithering...
? ? ? ? ? ? ? ? ? Sammy moved 5m
? ? ? ? ? ? ? ? ? Galloping...
? ? ? ? ? ? ? ? ? Tommy moved 34m
說明:派生類包含一個構(gòu)造函數(shù)時答毫,它必須調(diào)用super()褥民,它會執(zhí)行基類的構(gòu)造函數(shù)。
公共烙常,私有與受保護(hù)的修飾符
默認(rèn)為public
ts中定義的類中的成員默認(rèn)為public轴捎,成員不用其他修飾符修飾時,可以自由的訪問程序里定義的成員蚕脏。
理解private:私有
當(dāng)成員被標(biāo)記為private侦副,它就不能被聲明它的類的外部訪問。
class Animal {
? ? private name: string;
? ? constructor(theName: string) { this.name = theName; }
}
new Animal('Cat').name; // error: name is private
理解protected:受保護(hù)的
protected和private相似驼鞭,但有一點(diǎn)秦驯,protected成員在派生類中仍然可以訪問。
若構(gòu)造很熟constructor被標(biāo)記為protected挣棕,則該類不能被實(shí)例化译隘。
readonly修飾符
只讀屬性必須在聲明時或構(gòu)造函數(shù)里被初始化。
參數(shù)屬性
參數(shù)屬性通過給構(gòu)造函數(shù)參數(shù)添加一個訪問限定符來聲明洛心。使用private固耘,public,protected限定一個參數(shù)屬性會聲明并初始化一個私有/公共/被保護(hù)的成員词身。
class Animal {
? ? constructor(private name: string) {}
? ? move(meter: number) {
? ? ? ? console.log(`${this.name} moved ${meter}m`);
????}
}
存取器
通過get和set來截取對對象成員的訪問厅目。
靜態(tài)屬性:static
使用static定義的成員,每個實(shí)例想要訪問這個成員時法严,都需要在成員前面加上類名损敷,如同實(shí)例屬性上使用this.。
class Grid {
? ? static origin = 10;
? ? constructor (public scale: number) {}
? ? lowLen(x: number) {
? ? ? ? let length01 = x*this.scale - Grid.origin;
? ? ? ? return length01;
????}
}
let grid01 = new Grid(2.0);
console.log(grid01.lowLen(60)); //110
抽象類:abstract
1深啤、抽象類作為其他派生類的基類使用拗馒,一般不能直接被實(shí)例化。
2溯街、抽象類中的抽象方法不包含具體實(shí)現(xiàn)且必須在派生類中實(shí)現(xiàn)诱桂。
abstract class Department {
? ? constructor(public name: string) {}
? ? printName(): void {
? ? ? ? console.log('Department name: ' + this.name);
? ? }
? ? abstract printMeeting(): void; // 必須在派生類中實(shí)現(xiàn)
}
class AccountingDepartment extends Department {
? ? constructor() {
? ? ? ? super('Accounting and Auditing'); // 在派生類的構(gòu)造函數(shù)中必須調(diào)用 super()
? ? }
? ? printMeeting(): void {
? ? ? ? console.log('The Accounting Department meets each Monday at 10am.');
? ? }
? ? generateReports(): void {
? ? ? ? console.log('Generating accounting reports...');
? ? }
}
let department: Department; // 允許創(chuàng)建一個對抽象類型的引用
department = new Department(); // 錯誤: 不能創(chuàng)建一個抽象類的實(shí)例
department = new AccountingDepartment(); // 允許對一個抽象子類進(jìn)行實(shí)例化和賦值
department.printName();
department.printMeeting();
department.generateReports(); // 錯誤: 方法在聲明的抽象類中不存在
高級技巧
把類當(dāng)做接口使用
class Point {
? ? x: number;
? ? y: number;
}
interface Point3d extends Point {
? ? z: number;
}
let point3d: Point3d = {x: 1, y: 2, z: 3};