:16、面向?qū)ο笏俨? alt=)
面向?qū)ο笏俨門ypeScript 面向?qū)ο蟛糠挚梢詺w納為四個(gè)關(guān)鍵詞類、封裝、繼承和抽象。接口與泛型則進(jìn)一步幫助我們描述結(jié)構(gòu)和復(fù)用類型邏輯。一、類的基本模板classPerson{name:string;age:number;constructor(name:string,age:number){this.namename;this.ageage;}sayHello():void{console.log(大家好我是this.name);}}constpersonnewPerson(孫悟空,18);person.sayHello();成員作用屬性保存對(duì)象數(shù)據(jù)構(gòu)造函數(shù)創(chuàng)建實(shí)例時(shí)初始化數(shù)據(jù)方法描述對(duì)象行為this表示當(dāng)前實(shí)例new創(chuàng)建類的實(shí)例二、訪問(wèn)修飾符修飾符當(dāng)前類子類類外部public可以訪問(wèn)可以訪問(wèn)可以訪問(wèn)protected可以訪問(wèn)可以訪問(wèn)不可以訪問(wèn)private可以訪問(wèn)不可以訪問(wèn)不可以訪問(wèn)示例classUser{publicname:string;protectedrole:string;privatepassword:string;constructor(name:string,role:string,password:string){this.namename;this.rolerole;this.passwordpassword;}}建議默認(rèn)公開(kāi)的成員才使用public。只允許子類使用的成員使用protected。內(nèi)部實(shí)現(xiàn)細(xì)節(jié)使用private。三、readonly、getter 和 setterreadonlyclassUser{readonlyid:number;constructor(id:number){this.idid;}}readonly屬性初始化后不能重新賦值。getter 和 setterclassPerson{private_name:string;constructor(name:string){this._namename;}getname():string{returnthis._name;}setname(value:string){if(value.trim()){this._namevalue;}}}記憶方式get讀取屬性。set修改屬性。四、靜態(tài)成員classMathTools{staticPI3.1415926;staticsum(a:number,b:number):number{returnab;}}console.log(MathTools.PI);console.log(MathTools.sum(1,2));靜態(tài)成員屬于類本身通過(guò)類名訪問(wèn)不需要?jiǎng)?chuàng)建實(shí)例。五、繼承和方法重寫classAnimal{constructor(publicname:string){}run():void{console.log(this.name正在跑);}}classDogextendsAnimal{bark():void{console.log(this.name在汪汪叫);}overriderun():void{console.log(狗正在跑);}}constdognewDog(旺財(cái));dog.run();dog.bark();關(guān)鍵語(yǔ)法語(yǔ)法作用extends繼承父類super(...)調(diào)用父類構(gòu)造函數(shù)super.method()調(diào)用父類方法override明確表示重寫父類成員六、抽象類abstractclassAnimal{abstractrun():void;bark():void{console.log(動(dòng)物在叫);}}classDogextendsAnimal{run():void{console.log(狗在跑);}}抽象類的特點(diǎn)不能直接實(shí)例化??梢园胀▽傩院推胀ǚ椒ā?梢园橄蠓椒āW宇惐仨殞?shí)現(xiàn)抽象方法。七、接口描述對(duì)象結(jié)構(gòu)interfacePerson{name:string;sayHello():void;}functiongreet(person:Person):void{person.sayHello();}類實(shí)現(xiàn)接口classStudentimplementsPerson{constructor(publicname:string){}sayHello():void{console.log(我是this.name);}}implements只負(fù)責(zé)檢查結(jié)構(gòu)不會(huì)自動(dòng)生成接口中的屬性和方法。八、泛型泛型函數(shù)functionidentityT(value:T):T{returnvalue;}identity(100);identity(hello);泛型類classBoxT{constructor(publicvalue:T){}}constnumberBoxnewBox(100);conststringBoxnewBox(hello);泛型約束interfaceHasLength{length:number;}functiongetLengthTextendsHasLength(value:T):number{returnvalue.length;}九、接口、抽象類和普通類的區(qū)別類型主要作用能否包含具體實(shí)現(xiàn)能否直接實(shí)例化接口描述結(jié)構(gòu)和契約不能不能抽象類提供通用模型和部分實(shí)現(xiàn)可以不能普通類創(chuàng)建具體對(duì)象可以可以十、面向?qū)ο笤O(shè)計(jì)建議類負(fù)責(zé)描述對(duì)象狀態(tài)和行為。不要把所有屬性都公開(kāi)優(yōu)先保護(hù)內(nèi)部狀態(tài)。父類放公共邏輯子類放具體差異。只需要約束結(jié)構(gòu)時(shí)優(yōu)先考慮接口。需要共享實(shí)現(xiàn)時(shí)再考慮抽象類或繼承。重復(fù)的類型邏輯優(yōu)先使用泛型。十一、本章小結(jié)類解決對(duì)象創(chuàng)建和行為組織問(wèn)題。封裝解決屬性訪問(wèn)和數(shù)據(jù)保護(hù)問(wèn)題。繼承解決公共邏輯復(fù)用問(wèn)題。抽象類解決通用模型和強(qiáng)制實(shí)現(xiàn)問(wèn)題。接口解決結(jié)構(gòu)約束問(wèn)題。泛型解決類型安全的代碼復(fù)用問(wèn)題。