1. 程式人生 > 其它 >原生 JS 實現樹元件

原生 JS 實現樹元件

面向物件與面向過程

  1. 面向過程思想

    1. 步驟清晰簡單,第一步做什麼,第二步做什麼...

    2. 面向過程適合處理一些較為簡單的問題

  2. 面向物件思想

    1. 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索

    2. 面向物件適合處理複雜的問題,適合處理需要多人協作的問題

  3. 對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理

 

什麼是面向物件

  • 面向物件程式設計(Object-Oriented Programming,OOP)

  • 面向物件程式設計的本質就是:以類的方式組織程式碼,以物件的組織(封裝)資料

  • 抽象

  • 三大特性:

    1. 封裝

    2. 繼承

    3. 多型

  • 從認識論角度考慮,是先有物件後有類。物件,是具體的事物。類,是抽象的,是對物件的抽象

  • 從程式碼執行角度考慮是先有類後有物件。類是物件的模板

 

類與物件的關係

  • 類是一種抽象的資料型別,它是對某一類事物整體描述/定義,但是並不能代表某一個具體的事物

    • 動物、植物、手機、電腦....

    • Person類、Pet類、Car類等,這些類都是用來描述/定義某一類具體的事物應該具備的特點和行為

  • 物件是抽象概念的具體例項

    • 張三就是人的一個具體例項,張三家裡的旺財就是狗的一個具體例項

    • 能夠體現出特點,展現出功能的是具體的例項,而不是一個抽象的概念

 

建立與初始化物件

  • 使用new關鍵字建立物件

  • 使用new關鍵字建立的時候,除了分配記憶體空間之外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫

  • 類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的。並且構造器有以下倆個特點:

    1. 必須和類的名字相同

    2. 必須沒有返回值,也不能寫void

 

建立物件記憶體分析

程式碼部分

記憶體

 

封裝

  • 該露的露,該藏的藏

    • 我們程式設計要追求“高內聚,低耦合”。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用

  • 封裝(資料的隱藏)

    • 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏

  • 屬性私有,get/set

 

繼承

  • 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模

  • extends的意思是“拓展”。子類是父類的拓展

  • Java中類只有單繼承,沒有多繼承

  • 繼承是類和類之間的一種關係。除此以外,類和類之間的關係還有依賴、組合、聚合等

  • 繼承關係的倆個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示

  • 子類和父類之間,從意義上講應該具有“is a”關係

 

super

super()注意點:
   super()呼叫父類的構造方法,必須在構造方法第一位
   必須只能出現在子類的方法或者構造方法中
   super()和this()不能同時呼叫構造方法

對比this():
   代表的物件不同:
       this:代表呼叫者這個物件
       super:代表父類物件的呼叫
   前提:
       this:沒有繼承關係也可以使用
       super:只能在繼承條件下才能使用繼承條件
   呼叫構造方法的區別:
       this:預設呼叫本類的構造
       super:呼叫父類的構造

 

方法重寫

  1. 需要有繼承關係,子類繼承父類

  2. 方法名必須相同,引數列表必須相同

  3. 方法修飾符不能寫靜態(static),因為靜態的在類載入時就載入,不能重寫

  4. 訪問修飾符範圍只能擴大,不能縮小:Public>Protected>Default>Private

 

多型

  • 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式

  • 一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多

  • 多型存在的條件

    1. 有繼承關係

    2. 子類重寫父類方法

    3. 父類引用指向子類物件

  • 注意:多型是方法的多型,屬性沒有多型性

 

抽象類

  • abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法;如果修飾類,那麼該類就是抽象類

  • 抽象類中可以沒有抽象方法,但抽象方法的類一定要宣告為抽象類

  • 抽象類不能使用new關鍵字來建立物件,它是用來讓子類繼承的

  • 抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的

  • 子類繼承抽象類,要麼就必須實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類

 

介面

  • 普通類:只有具體實現

  • 介面類:具體實現和規範(抽象方法)都有

  • 介面:只有規範

  • 介面就是規範,定義了一組規則,體現了現實世界中”如果你是...則必須能...“的思想。

  • 介面的本質就是契約,就像我們人間的法律一樣。指定好後大家都遵守

  • OO的精髓,是對物件的抽象,最能體現這一點的就是介面。為什麼我們討論設計模式只針對具備了抽象能力的語言(比如C++、Java、C#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象

  • 宣告類的關鍵字是class,宣告介面的關鍵字是interface

內部類

內部類就是在一個類的內部再定義一個類,比如,A類定義了一個B類,那麼B類相對於A類來說就稱為內部類,而A類相對於B類來說就是外部類

  1. 成員內部類

  2. 靜態內部類

  3. 區域性內部類

  4. 匿名內部類

package oop.demo06;
//java內部類
public class Outer {
   private int id = 10;
   public void out(){
       System.out.println("Java內部類");
  }
   
   public void method(){
       class Inner03{
           public void in(){
               System.out.println("區域性內部類");
          }
      }
  }
   //成員內部類
   public class Inner01{
       public void in(){
           System.out.println("Java外部類");
      }
       public void getId(){
           System.out.println(id);
      }
  }
   
   public static class Inner02{
       public void in(){
           System.out.println("靜態內部類");
      }
  }

}

執行

package oop.demo06;

public class Application {
   public static void main(String[] args) {
       Outer outer = new Outer();//例項化外部類
       Outer.Inner01 inner = outer.new Inner01();//通過外部類例項化內部類
       inner.getId();//根據外部類的方法呼叫內部類的屬性
       new Outer().method();//new Outer()並沒有用物件名去接,即匿名內部類
  }
}