JavaScript 學習筆記(7)--Object Oriented

目錄

繼承

Private and Protected

枚舉


繼承

之前在ES6中沒有太多的介紹繼承和多態,因爲理解起來還是很簡單的:

class Programmer extends Person{
    private hair:boolean;
    constructor(firstName, lastName, hair:boolean){
        super(firstName,lastName );
        this.hair = hair;
    }

    displayName(): string {
        return "changed"
    }

    displayOldName(){
        return super.displayName()
    }
}

這是對JavaScript 學習筆記(7)--TS初見中Person對象的一個繼承,和ES6是一樣的,在寫之前忽然忘記了構造函數怎麼繼承了,這裏貼出來就當複習一下。多態的話不再詳細展開,上述代碼中去除private聲明的話,我們聲明一個對象:

let Asen: Person = new Programmer('Asen','Wang', false);
console.log(Asen.hair);

會爆出如下錯誤,但如果沒有添加hair屬性,或者不輸出hair,我們發現Asen是可以設定爲Person類型的。 

Error:(42, 18) TS2339: Property 'hair' does not exist on type 'Person'.

Private and Protected

這方面是在學習JS時我沒有認真對待的一部分。

let Asen: Person = new Programmer('Asen','Wang', false); 
console.log(Asen.hair)

上述代碼會報錯:

Error:(42, 18) TS2341: Property 'hair' is private and only accessible within class 'Programmer'.

這樣如果我們想去調用私有屬性,需要寫一個公共方法。

printPrivateHair(){
        console.log(this.hair);
    }

這時我們可以得到私有屬性中的方法,但是需要注意的是,對於子類新創建的方法,我們是沒有辦法傳遞私有屬性的。

Asen.printPrivateHair();

C:\Users\...\WebstormProjects\TypeScript\TS1>node object.js
false

這就要引申出protected修飾,在很多語言中,protected修飾的值在子類中是可以直接打印出來的,但是在TS中是不允許的,它和private一樣只能使用公共方法調用。那麼這兩着有什麼區別呢?

class Person {
    private readonly firstName: string;
    protected lastName: string;
    public age: number;

    constructor(firstName: string, lastName: string, age:number) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    getFirstName(): string {
        return this.firstName
    }

    setLastName(lastName): void{
        this.lastName = lastName;
    }
}

class Programmer extends Person{
    public readonly hair:boolean;
    constructor(firstName, lastName,age, hair:boolean){
        super(firstName,lastName, age );
        this.hair = hair;
    }
    getName(){
        return `${this.lastName}' ' and ' '${this.firstName}  `
    }
}

由上面這個例子,在定義新的方法"getName()"的時候,使用私有屬性是不能被調用的,但是保護屬性是可以被調用的,這就是兩者的一點不同。

同時,如果我們給Person類的構造方法添加"protected"修飾,我們是不能對Person類直接傳參數的,但是可以對"programmer"傳參,與上面特性其實是相同的,private則都不能傳參。

枚舉

在ES6中對枚舉只是簡單帶過,這裏舉個例子複習一下,順便,其實枚舉也有很多用途,許多下拉框的字符串可以以枚舉的數字值來表示,這其實是一個很有用的特性。

enum DayOfWeek{
    Day, ofWeek, week
}
let plan: DayOfWeek = DayOfWeek.Day;
console.log(typeof plan, plan);
//0,number 0

最後是幾個工具,包括直接編譯運行TS文件ts-node,Webstorm好用的調試器JetBrains IDE Support等,大家自己去發掘想使用的工具吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章