JS面向?qū)ο缶幊毯唵卫斫?/h2>

1. 面向過程與面向?qū)ο?/h2>

面向過程(Procedure Oriented):以過程為核心,強調(diào)事件的流程、順序。
面向?qū)ο?/a>(Object Oriented):以對象為核心,強調(diào)事件的角色、主體。

舉個簡單的例子 - 把大象裝進冰箱:

  • 面向過程:按照步驟(過程)來編程
    1. 打開冰箱
    2. 把大象裝進去
    3. 關閉冰箱
  • 面向?qū)ο?br> 首先確定兩個對象, 大象和冰箱。
    然后確定它們的功能:
    ????大象 - 裝進某個東西
    ????冰箱 - 打開,關閉
    最后調(diào)用這兩個對象的功能來實現(xiàn)。

從效果上來說:
面向過程性能高,不易維護。適合簡單系統(tǒng)。
面向?qū)ο笠拙S護、易復用、易擴展,更加靈活。性能比面向過程低,更適合復雜系統(tǒng)。

2. 類和對象

類:抽象出的對象的公共部分(屬性和方法)。
對象:具體的事物。通過類實例化一個具體的對象。

比如,平時說的 狗(會叫,會咬人) 就是一個類。
你的狗是二哈,你的狗就是具體的對象。
二哈具有狗這個類的屬性(會叫,會咬人),也有自己的一些屬性(睡覺打呼嚕)。

面向?qū)ο笕筇匦裕悍庋b、繼承和多態(tài)。
封裝:把公共的部分封裝起來,比如封裝成 類。
繼承:子類能夠繼承父類的屬性和方法。
多態(tài):同一操作作用于不同的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。比如:你的狗會汪汪叫,我的狗會嗚嗚叫。它們都會叫,但是表現(xiàn)不同。

3. ES6類的代碼實現(xiàn)

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  say() {
    console.log(`我叫${this.name}, 今年${this.age}歲`);
  }
}

const jack = new Person('Jack', 18);
jack.say(); // 我叫Jack, 今年18歲

// 子類繼承父類
class Student extends Person {}

const jim = new Student('Jim', 19);
jim.say(); // 我叫Jim, 今年19歲

方法調(diào)用優(yōu)先級:繼承中,如果子類有個某個方法就先調(diào)用子類的,子類沒有再調(diào)用父類的。

4. super關鍵字

在子類中,使用super關鍵字可以調(diào)用父類的方法。
super()調(diào)用父類的構(gòu)造函數(shù),super.say()調(diào)用父類的普通函數(shù)。需要注意的是, super 必須在子類 this 前調(diào)用。
比如:

class Student extends Person {
  constructor(name, age, score) {
    this.score = score; // 正確的寫法應該把super調(diào)用放在這句前面
    super(name, age);
  }
  say() {
    super.say();
    console.log(`我考了${this.score}分`);
  }
}
const jim = new Student('Jim', 19, 100);
jim.say();

就會報錯:


5. 需要注意的點

類里面共有的屬性和方法一定要加 this 使用。
構(gòu)造器中的 this 指向當前實例對象。
類里面方法中的 this 指向這個方法的調(diào)用者(還是當前實例對象)。


參考資料:
傳智教育 - JavaScript進階面向?qū)ο驟S6
面向過程與面向?qū)ο蟮膮^(qū)別

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容