前言
JavaScript使用函式和prototype-based的方式去實現元件化,但是會造成以後維護災難的發生,日前ES6也開始加入類別的特性,但是TypeScript一開始就有以物件導向語言去做發展.我目前覺得TypeScript發展模組開發會好管理.
類別函式宣告
語法:
class 類別名稱{
//屬性 private|public|protect
修飾子 屬性名稱;
//建構子
constructor(){
//內容
}
函式名稱(參數名稱:參數類型):回傳類型{
//內容
}
}
說明:
private : 私人修飾子宣告讓外面無法直接存取該屬性
public : 公用修飾子讓外面可以直接存取該屬性
protect : 保護修飾子只能讓有繼承的類別可以存取該屬性
範例:類別宣告
class Person { private name:string ; constructor(name:string){ this.name = name } sayHi() { return `The person's name is ${this.name}`; } } let person = new Person('Jack'); console.log(person.sayHi());
輸出結果:
The person's name is Jack
繼承(Default Parameters)
TypeScript有時我們需要可以利用繼承方法來建構元件,元件的可用性更好使用.
範例:
//預設參數 class Robot extends Person{ public talk(){ console.log('I am a robot'); } } let robot = new Robot('robot 1 '); robot.talk() ;
輸出結果:
I am a robot
抽象(abstract)
抽象類別跟介面很像,最大部分不同地方是抽象類別只需要實作部分需告方法,如果有類別大部分方法的行為相同,但是有少部分的不同,就可以定義為抽象類別.例如:我們定義一個抽象類別為動物(Animal),所有的動物都會靠嘴巴覓食(forage)所以可以實作相同方法,走路(walk)或是跑(run)這個方法,每個動物實作的方法不同,我們可以定義成抽象函式,舉例狗是用四隻腳走路,跑也是,但是鳥走路可能是用跳;跑步可能是用飛.
範例:
abstract class Animal{ type:string ; forage():void{ console.log(this.type+"吃飯") } abstract walk(); //抽象函式 abstract run(); //抽象函式 } class Bird extends Animal{ constructor(type:string){ super(); this.type = type; } walk() { console.log(this.type+"用跳的") } run() { console.log(this.type+"用飛") } } class Dog extends Animal{ constructor(type:string){ super(); this.type = type; } walk() { console.log(this.type+"用四隻腳走路") } run() { console.log(this.type+"用四隻腳跑步") } } let dog = new Dog("狗"); dog.walk(); dog.run(); let bird = new Bird("鳥"); bird.walk(); bird.run();
輸出結果:
狗用四隻腳走路
狗用四隻腳跑步
鳥用跳的
鳥用飛
介面(Interface)
在typeScript的介面是一種規格,其定義屬性和方法,跟其他語言的interface
使用情境相同,通常用來定義前端元件的介面,例如表格的欄位定義成介面,可以依照不同的需求去實作表格欄位定義,這個好處是對表格欄位來說比較好維護.
範例:
interface ICar { color:string; //顏色 engine:string;//引擎 type:string; //型號 speed:number; //速度 setSpeed(speed:number) ; //設定引擎速度 }
在實作介面中,TypeScript需要重新宣告屬性一次,然後實作這個介面所定義的規格.
範例:
class HRV implements ICar{ color: string; engine: string; type: string; speed: number; constructor( color:string, engine:string, type:string){ this.color = color ; this.engine =engine; this.type = type ; } setSpeed(speed: number) { this.speed = speed; } } var hrv :ICar = new HRV("blue","SOHC 直列 4 汽缸 i-VTEC 智慧型可變汽門正時與揚程電子控制系統","一般"); hrv.setSpeed(100); console.log(hrv.engine); console.log(hrv.speed);
介面繼承
介面繼承又稱介面擴充,他可以像類別一樣延展介面功能,增加元件介面的可用性.由範例知道有一個介面為Shape定義基本的顏色,Square就是延伸Shape功能增加長度和寬度.
範例:
interface Shape{ color:string; } interface Square extends Shape{ width:number; height:number; } let square = {}; square.color="blue" ; square.width=100; square.height=10;
留言
張貼留言