TS學習——面向對象

面向對象是程序中一個非常重要的思想,它被很多同學理解成了一個比較難,比較深奧的問題,其實不然。面向對象很簡單,簡而言之就是程序之中所有的操作都需要通過對象來完成。

  • 舉例來說:
    • 操作瀏覽器要使用window對象
    • 操作網頁要使用document對象
    • 操作控制臺要使用console對象

一切操作都要通過對象,也就是所謂的面向對象,那么對象到底是什么呢?這就要先說到程序是什么,計算機程序的本質就是對現實事物的抽象,抽象的反義詞是具體,比如:照片是對一個具體的人的抽象,汽車模型是對具體汽車的抽象等等。程序也是對事物的抽象,在程序中我們可以表示一個人、一條狗、一把槍、一顆子彈等等所有的事物。一個事物到了程序中就變成了一個對象。

在程序中所有的對象都被分成了兩個部分數據和功能,以人為例,人的姓名、性別、年齡、身高、體重等屬于數據,人可以說話、走路、吃飯、睡覺這些屬于人的功能。數據在對象中被成為屬性,而功能就被稱為方法。所以簡而言之,在程序中一切皆是對象。

1、類(class)

要想面向對象,操作對象,首先便要擁有對象,那么下一個問題就是如何創建對象。要創建對象,必須要先定義類,所謂的類可以理解為對象的模型,程序中可以根據類創建指定類型的對象,舉例來說:可以通過Person類來創建人的對象,通過Dog類創建狗的對象,通過Car類來創建汽車的對象,不同的類可以用來創建不同的對象。

  • 定義類:

    • class 類名 {屬性名: 類型;constructor(參數: 類型){this.屬性名 = 參數;}方法名(){....}}
      
  • 示例:

    • class Person{name: string;age: number;constructor(name: string, age: number){this.name = name;this.age = age;}sayHello(){console.log(`大家好,我是${this.name}`);}
      }
      
  • 使用類:

    • const p = new Person('孫悟空', 18);
      p.sayHello();
      

2、面向對象的特點

  • 封裝

    • 對象實質上就是屬性和方法的容器,它的主要作用就是存儲屬性和方法,這就是所謂的封裝

    • 默認情況下,對象的屬性是可以任意的修改的,為了確保數據的安全性,在TS中可以對屬性的權限進行設置

    • 只讀屬性(readonly):

      • 如果在聲明屬性時添加一個readonly,則屬性便成了只讀屬性無法修改
    • TS中屬性具有三種修飾符:

      • public(默認值),可以在類、子類和對象中修改
      • protected ,可以在類、子類中修改
      • private ,可以在類中修改
    • 示例:

      • public

        • class Person{public name: string; // 寫或什么都不寫都是publicpublic age: number;constructor(name: string, age: number){this.name = name; // 可以在類中修改this.age = age;}sayHello(){console.log(`大家好,我是${this.name}`);}
          }class Employee extends Person{constructor(name: string, age: number){super(name, age);this.name = name; //子類中可以修改}
          }const p = new Person('孫悟空', 18);
          p.name = '豬八戒';// 可以通過對象修改
          
      • protected

        • class Person{protected name: string;protected age: number;constructor(name: string, age: number){this.name = name; // 可以修改this.age = age;}sayHello(){console.log(`大家好,我是${this.name}`);}
          }class Employee extends Person{constructor(name: string, age: number){super(name, age);this.name = name; //子類中可以修改}
          }const p = new Person('孫悟空', 18);
          p.name = '豬八戒';// 不能修改
          
      • private

        • class Person{private name: string;private age: number;constructor(name: string, age: number){this.name = name; // 可以修改this.age = age;}sayHello(){console.log(`大家好,我是${this.name}`);}
          }class Employee extends Person{constructor(name: string, age: number){super(name, age);this.name = name; //子類中不能修改}
          }const p = new Person('孫悟空', 18);
          p.name = '豬八戒';// 不能修改
          
    • 屬性存取器

      • 對于一些不希望被任意修改的屬性,可以將其設置為private

      • 直接將其設置為private將導致無法再通過對象修改其中的屬性

      • 我們可以在類中定義一組讀取、設置屬性的方法,這種對屬性讀取或設置的屬性被稱為屬性的存取器

      • 讀取屬性的方法叫做setter方法,設置屬性的方法叫做getter方法

      • 示例:

        • class Person{private _name: string;constructor(name: string){this._name = name;}get name(){return this._name;}set name(name: string){this._name = name;}}const p1 = new Person('孫悟空');
          console.log(p1.name); // 通過getter讀取name屬性
          p1.name = '豬八戒'; // 通過setter修改name屬性
          
    • 靜態屬性

      • 靜態屬性(方法),也稱為類屬性。使用靜態屬性無需創建實例,通過類即可直接使用

      • 靜態屬性(方法)使用static開頭

      • 示例:

        • class Tools{static PI = 3.1415926;static sum(num1: number, num2: number){return num1 + num2}
          }console.log(Tools.PI);
          console.log(Tools.sum(123, 456));
          
    • this

      • 在類中,使用this表示當前對象
  • 繼承

    • 繼承時面向對象中的又一個特性

    • 通過繼承可以將其他類中的屬性和方法引入到當前類中

      • 示例:

        • class Animal{name: string;age: number;constructor(name: string, age: number){this.name = name;this.age = age;}
          }class Dog extends Animal{bark(){console.log(`${this.name}在汪汪叫!`);}
          }const dog = new Dog('旺財', 4);
          dog.bark();
          
    • 通過繼承可以在不修改類的情況下完成對類的擴展

    • 重寫

      • 發生繼承時,如果子類中的方法會替換掉父類中的同名方法,這就稱為方法的重寫

      • 示例:

        • class Animal{name: string;age: number;constructor(name: string, age: number){this.name = name;this.age = age;}run(){console.log(`父類中的run方法!`);}
          }class Dog extends Animal{bark(){console.log(`${this.name}在汪汪叫!`);}run(){console.log(`子類中的run方法,會重寫父類中的run方法!`);}
          }const dog = new Dog('旺財', 4);
          dog.bark();
          
        • 在子類中可以使用super來完成對父類的引用

    • 抽象類(abstract class)

      • 抽象類是專門用來被其他類所繼承的類,它只能被其他類所繼承不能用來創建實例

      • abstract class Animal{abstract run(): void;bark(){console.log('動物在叫~');}
        }class Dog extends Animals{run(){console.log('狗在跑~');}
        }
        
      • 使用abstract開頭的方法叫做抽象方法,抽象方法沒有方法體只能定義在抽象類中,繼承抽象類時抽象方法必須要實現

3、接口(Interface)

接口的作用類似于抽象類,不同點在于接口中的所有方法和屬性都是沒有實值的,換句話說接口中的所有方法都是抽象方法。接口主要負責定義一個類的結構,接口可以去限制一個對象的接口,對象只有包含接口中定義的所有屬性和方法時才能匹配接口。同時,可以讓一個類去實現接口,實現接口時類中要保護接口中的所有屬性。

  • 示例(檢查對象類型):

    • interface Person{name: string;sayHello():void;
      }function fn(per: Person){per.sayHello();
      }fn({name:'孫悟空', sayHello() {console.log(`Hello, 我是 ${this.name}`)}});
  • 示例(實現)

    • interface Person{name: string;sayHello():void;
      }class Student implements Person{constructor(public name: string) {}sayHello() {console.log('大家好,我是'+this.name);}
      }
      

4、泛型(Generic)

定義一個函數或類時,有些情況下無法確定其中要使用的具體類型(返回值、參數、屬性的類型不能確定),此時泛型便能夠發揮作用。

  • 舉個例子:

    • function test(arg: any): any{return arg;
      }
      
    • 上例中,test函數有一個參數類型不確定,但是能確定的時其返回值的類型和參數的類型是相同的,由于類型不確定所以參數和返回值均使用了any,但是很明顯這樣做是不合適的,首先使用any會關閉TS的類型檢查,其次這樣設置也不能體現出參數和返回值是相同的類型

    • 使用泛型:

    • function test<T>(arg: T): T{return arg;
      }
      
    • 這里的<T>就是泛型,T是我們給這個類型起的名字(不一定非叫T),設置泛型后即可在函數中使用T來表示該類型。所以泛型其實很好理解,就表示某個類型。

    • 那么如何使用上邊的函數呢?

      • 方式一(直接使用):

        • test(10)
          
        • 使用時可以直接傳遞參數使用,類型會由TS自動推斷出來,但有時編譯器無法自動推斷時還需要使用下面的方式

      • 方式二(指定類型):

        • test<number>(10)
          
        • 也可以在函數后手動指定泛型

    • 可以同時指定多個泛型,泛型間使用逗號隔開:

      • function test<T, K>(a: T, b: K): K{return b;
        }test<number, string>(10, "hello");
        
      • 使用泛型時,完全可以將泛型當成是一個普通的類去使用

    • 類中同樣可以使用泛型:

      • class MyClass<T>{prop: T;constructor(prop: T){this.prop = prop;}
        }
        
    • 除此之外,也可以對泛型的范圍進行約束

      • interface MyInter{length: number;
        }function test<T extends MyInter>(arg: T): number{return arg.length;
        }
        
      • 使用T extends MyInter表示泛型T必須是MyInter的子類,不一定非要使用接口類和抽象類同樣適用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208322.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

生成fip.bin在Milkv-duo上跑rtthread的相關嘗試,及其問題分析

前言 &#xff08;1&#xff09;PLCT實驗室實習生長期招聘&#xff1a;招聘信息鏈接 &#xff08;2&#xff09;本來是想在Milkv-duo上跑rtthread的&#xff0c;做了很多努力&#xff0c;一直沒有結果。雖然不知道最終能不能成功做出來&#xff0c;還是把自己的相關努力分享出來…

MDK官網如何下載stm32支持包

網站&#xff1a;https://www.keil.com/demo/eval/arm.htm 1 2 3點這個下載

基于Mint Mate 21.2 Victoria 的Anjuta安裝與測試

序言 Linux mint mate 21.2 命名為 victoria 版&#xff0c;在vmware虛擬機中安裝按提示默認安裝即可&#xff0c;不做更多記錄。mint mate的優點是穩定&#xff0c;窗口質感好。安裝完成后&#xff0c;需要關注一些常用功能配置。主要有&#xff1a;顯示器調整、桌面調整、工…

當然熱門的原創改寫改寫大全【2023最新】

在信息時代&#xff0c;隨著科技的不斷發展&#xff0c;改寫軟件逐漸成為提高文案質量和寫作效率的重要工具。本文將專心分享一些好用的改寫軟件&#xff0c;其中包括百度文心一言智能寫作以及147SEO改寫軟件。這些工具不僅支持批量改寫&#xff0c;而且在發布到各大平臺后能夠…

python爬取 HTTP_2 網站超時問題的解決方案

問題背景 在進行網絡數據爬取時&#xff0c;使用 Python 程序訪問支持 HTTP/2 協議的網站時&#xff0c;有時會遇到超時問題。這可能會導致數據獲取不完整&#xff0c;影響爬蟲程序的正常運行。 問題描述 在實際操作中&#xff0c;當使用 Python 編寫的爬蟲程序訪問支持 HTT…

使用高防IP防護有哪些優勢

高防IP是針對互聯網服務器在遭受大流量的DDoS攻擊后導致服務不可用的情況下&#xff0c;推出的付費增值服務&#xff0c;用戶可以通過配置高防IP&#xff0c;將攻擊流量引流到高防IP&#xff0c;確保源站的穩定可靠。高防IP相當于搭建完轉發的服務器。 高防IP有兩種接入方式&a…

Notepad安裝

中文免安裝版&#xff0c;下載解壓即可。 NotepadV7.5.6 (訪問密碼: 1666)https://url48.ctfile.com/f/33868548-986668939-7a3316?p1666

Node-RED 設置登錄權限

Node-RED 提供了內置的 “adminAuth” 功能&#xff0c;使你能夠通過用戶名和密碼來保護對 Node-RED 編輯器的訪問。本文將向你展示如何配置登錄權限&#xff0c;以及一些相關的最佳實踐。以下是設置登錄權限的步驟&#xff1a; 步驟一&#xff1a;配置 AdminAuth 在 Node-RE…

react Hooks實現原理

Fiber 上篇文章fiber簡單理解記錄了react fiber架構&#xff0c;Hooks是基于fiber鏈表來實現的。閱讀以下內容時建議先了解react fiber。 jsx -> render function -> vdom -> fiber樹 -> dom vdom 轉 fiber 的過程稱為 recocile。diff算法就是在recocile這個過程…

LVS-DR+Keepalived+動靜分離實驗

架構圖 解釋一下架構&#xff0c;大概就是用Keepalived實現兩臺DR服務器的LVS負載均衡&#xff0c;然后后端服務器是兩臺Nginx服務器兩臺Tomcat服務器并且實現動靜分離這個實驗其實就是把 LVS-DRKeepalived 和 動靜分離 給拼起來&#xff0c;真的是拼起來&#xff0c;兩個部分…

在SQLServer中,把一個表的字段更新到另一個表中

在SQLServer中&#xff0c;把一個表的字段更新到另一個表中&#xff0c;應該如何實現? 你可以使用 UPDATE 語句結合 JOIN 來將一個表中的字段更新到另一個表中。假設你有兩個表&#xff0c;稱為 table1 和 table2&#xff0c;你想從 table1 中更新 table2&#xff0c;可以像這…

Rtrofit+Rxjava網絡請求封裝

好幾年前封裝的框架一直沒上傳&#xff0c;趁現在升級寫下。 簡介Retrofit是android的網絡請求庫&#xff0c;是一個RESTful的HTTP網絡請求框架的封裝&#xff08;基于okhttp&#xff09;。它內部網絡請求的工作&#xff0c;本質上是通過OkHttp完成&#xff0c;而Retrofit僅負責…

JVM虛擬機:執行Java程序并指定JVM參數

本文重點 在前面我們設置參數值的時候&#xff0c;需要在eclipse中的VM中進行參數設置&#xff0c;查詢的時候需要先jps&#xff0c;然后jinfo。這里嘗試動態的設置和查詢&#xff0c;也就是說在運行程序的時候就對其進行設置&#xff0c;并且進行查詢。 過程 為了確定參數修…

微信個人號機器人開發

簡要描述&#xff1a; 取消消息接收 請求URL&#xff1a; http://域名地址/cancelHttpCallbackUrl 請求方式&#xff1a; POST 請求頭Headers&#xff1a; Authorization&#xff1a;login接口返回Content-Type&#xff1a;application/json 無參數 返回數據&#xff…

MeteoInfo-Java解析與繪圖教程

MeteoInfo-Java解析與繪圖教程(四) 上文我們說到,將地圖疊加在色斑圖上,但大部分都是衛星繪圖,現在開始講解micaps數據繪圖,同樣也是更多自定義 配置 首先我們解析micaps數據,將之前學到的東西拿過來繪圖 MeteoDataInfo meteoDataInfo new MeteoDataInfo(); meteoDataInfo.o…

使用Binding的RelativeSource

一個Binding有明確的數據來源 可以通過Source或ElementName賦值的方法讓Binding與之關聯 但是有的時候我們不能確定作為Source的對象叫什么名字&#xff0c;但知道它與作為Binding目標的對象在UI上有相對關系&#xff0c;比如&#xff1a;空間自己關聯自己的某個數據、關聯自己…

Flutter代碼補全

有的時候屬性不經常使用&#xff0c;就想不起來該用啥&#xff0c;只有點點印象&#xff1b;只能用代碼補全功能&#xff0c;但我用了AS的默認操作發下并不好使&#xff0c;估計是快捷鍵沖突了。剛開始是不是下面的效果&#xff1a;這肯定不是我們想要的。 不怕&#xff0c;接下…

【S32DS報錯】-2-提示Error while launching command:arm-none-eabi-gdb –version錯誤

目錄 1 Error錯誤提示 2 Error錯誤原因 3 如何消除Error錯誤 結尾 【S32K3_MCAL從入門到精通】合集&#xff1a; S32K3_MCAL從入門到精通https://blog.csdn.net/qfmzhu/category_12519033.html 1 Error錯誤提示 使用S32DSJ-LinK下載程序&#xff0c;在Dedug Configurati…

計算機基礎知識67--BBS

遷移表格 # 以后你寫的每個python項目&#xff0c;都必須有一個txt文件叫 requirements.txt,里面放了當前項目所有的依賴&#xff0c;別人拿到項目---》需要執行 pip install -r requirements.txt # 裝好該項目所有依賴 django3.2.20 # 模塊 pillow mysqlclient # 主體項目功…

中東電商指南分享!盤點中東四大跨境電商平臺

提到跨境電商新藍海&#xff0c;就不得不想起土豪聚集地 ——中東&#xff0c;中東地區擁有龐大的人口、高人均GDP、強大的消費能力以及廣泛普及的互聯網&#xff0c;但外出購物卻相對不便&#xff0c;正是這一特點為中東跨境電商市場創造了巨大的優勢。隨著中東地區電商的崛起…