類
文檔
類就是用來創(chuàng)造對象的東西。
有一些語言(如 Java浸锨,存疑)創(chuàng)建對象必須先聲明一個類唇聘,而有的語言(JS)則不需要。
對于使用過 TS 的 JS 程序員來說柱搜,類可以讓你的系統(tǒng)更加「可預(yù)測」
這個對象不會出現(xiàn)一些我不知道的屬性迟郎,一切都盡在我的掌握。
代碼如下:
class Animal {
kind: string;
protected birth: string;
// 非完全公開聪蘸,能在自己class內(nèi)使用和在后代使用
constructor(kind: string){
this.kind = kind;
if (this.kind === '哺乳動物') {
this.birth = '胎生';
}else {
this.birth = '卵生';
}
}
move(): void {}
}
class Human extends Animal{
static xxx = 1 // 不能在外面使用Human.xxx =1
//上面為靜態(tài)屬性宪肖,不是對象的屬性,是Human的屬性
name: string;
private _age: number;
private secret: string;
//私有屬性健爬,只能在class內(nèi)被訪問控乾,其他默認為public
get age() {
return this._age
}
set age(value: number) {
if(value < 0) {
this._age = 0;
}else {
this._age = value;
}
}
// get set設(shè)計模式,先把屬性設(shè)為私有娜遵,如果用戶訪問則返回并且進行設(shè)置
constructor(name = 'fan', age = 18) { // 不傳為默認蜕衡,傳了可以改變
super('哺乳動物');
//對比interface 在類繼承時,必須調(diào)用super魔熏,相當(dāng)于調(diào)用了上個類的constructor
this.name = name;
this.age = age;
this.secret = '這是我的secret'
}
move(): void {}
say(): string {
this.move(); // 可以自己調(diào)用自己衷咽,通過this溝通
return 'hi'
}
}
let fan = new Human();
console.log(fan)
let jack = new Human('jack',19)
console.log(jack)
console.log(jack.constructor)
jack.age = -1;
console.log(jack.age);
// 在JS中,constructor也是實例的屬性,擁有class的所有屬性和方法
// 在使用new的時候,會自動調(diào)用constructor
//在調(diào)用時淡喜,傳入?yún)?shù)损离,并傳給this,當(dāng)執(zhí)行完织中,對象的地址將會返還給實例,this消失
打印出的結(jié)果
Human {kind: "哺乳動物", birth: "胎生", name: "fan", _age: 18, secret: "這是我的secret"}
1.ts:47
Human {kind: "哺乳動物", birth: "胎生", name: "jack", _age: 19, secret: "這是我的secret"}
1.ts:49
function Human(name, age) { … }
1.ts:50
0
1.ts:52
語法
- 聲明類
- 聲明對象的非函數(shù)屬性
- 聲明對象的函數(shù)屬性
- 使用 constructor
- 聲明類的屬性(static)
- 使用 this 代指當(dāng)前對象(注意不要以為 this 永遠都代指當(dāng)前對象,JS 的 this 有更多功能相寇,而且默認 this 為 window)
類繼承類
- 使用 super
修飾符
public private 和 protected
訪問器
get 和 set
抽象類
也可以叫做「爸爸類」:專門當(dāng)別的類的爸爸的類。
也可以叫做「沒有寫完的類」:只描述有什么方法钮科,并沒有完全實現(xiàn)這些方法唤衫。
由于這個類沒有寫完,所以不能創(chuàng)建出對象绵脯。(會報錯)
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log('roaming the earch...');
}
}
abstract 就是抽象的意思佳励。我建議你不用管抽象是什么意思休里,就死記硬背:抽象類就是爸爸類。
抽象類不能創(chuàng)建實例(因為沒有寫完)
高級技巧
構(gòu)造函數(shù)(如果聽不懂這一節(jié)赃承,可以以后回頭再聽)
我有一篇文章可能給你啟發(fā):https://zhuanlan.zhihu.com/p/23987456
由于 TS 的 class 其實就是 JS 里的 class妙黍,JS 里的 class 其實就是一個構(gòu)造函數(shù)。
換句話說瞧剖,類就是一個函數(shù)……
同時拭嫁,函數(shù)在JS里,是一種對象抓于。
所以類其實是一種對象做粤。
我知道這聽起來很奇怪,但是 JS 就是這么奇怪毡咏。
class Greeter {
static standardGreeting = "Hello, there";
greeting: string;
greet() {
if (this.greeting) {
return "Hello, " + this.greeting;
}
else {
return Greeter.standardGreeting;
}
}
}
let greeter1: Greeter;
greeter1 = new Greeter();
console.log(greeter1.greet());
let greeterMaker: typeof Greeter = Greeter; // 注意這句話
greeterMaker.standardGreeting = "Hey there!";
let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());
把類當(dāng)做接口使用
接口是低配版的類驮宴。
類是高配版的接口。
class Point {
x: number;
y: number;
}
interface Point3d extends Point {
z: number;
}
let point3d: Point3d = {x: 1, y: 2, z: 3};