1. 面向過程與面向?qū)ο?/h2>
面向過程(Procedure Oriented):以過程為核心,強調(diào)事件的流程、順序。
面向?qū)ο?/a>(Object Oriented):以對象為核心,強調(diào)事件的角色、主體。
舉個簡單的例子 - 把大象裝進冰箱:
- 面向過程:按照步驟(過程)來編程
- 打開冰箱
- 把大象裝進去
- 關閉冰箱
- 面向?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ū)別