面向對象與面向過程的區別:
優點 | 缺點 | |
面向過程 | 性能比面向對象高,適合跟硬件聯繫很緊密的東西 | 沒有面向對象易維護,易複用和易擴展 |
面向對象 | 易維護,易複用,易擴展,用於面向對象有封裝,繼承和多態的特性,可以設計出低耦合的系統,使系統更加靈活,更加易於維護 | 性能比面向過程低 |
面向對象的思維特定就是:
1)抽取(抽象)對象共有的屬性和行爲組織(封裝)成一個類(模板)
2)對類進行實例化,獲取類的對象
ES6中的類和對象:
---》創建類
//創建一個star 明星類
class Star{
//構造函數
constructor(uname,age){
this.uname=uname;
this.age=age;
}
}
//注意:
//類必須使用new關鍵字實例化對象
//創建實例:var James=new star();
注意事項:
1)通過class關鍵字創建類,類名定義首字母大寫
2)類裏面有個constructor函數,可以接受傳遞過來的參數,同時返回實例對象
3)constructor函數只要new 生成實例時,就會自動調用這個函數,如果不寫這個函數,類也會自動生成這個函數
4)生成實例new不能省略
5)最後注意語法規範,創建類 類名後面不需要加小括號 ,生成實例,類名後面需要添加小括號,構造函數不需要加function
---》類的繼承(extends)
類的繼承的關鍵字是【extends】;當子類繼承父類的時候,實例化子類之後,子類可以使用父類的一些方法
class Father{
constructor(){
}
//父類的方法
money(){
console.log(100000);
}
}
//子類繼承父類
class Son extends Father{
}
//實例化子類
var son=new Son();
son.money();
輸出結果:
---》super關鍵字
用於調用父類上的函數,可以調用父類上的構造函數,也可以調用父類上的普通函數
class Father {
constructor(x, y) {
this.x = x;
this.y = y;
}
sum() {
console.log(this.x + this.y);
}
}
class Son extends Father {
constructor(x, y) {
super(x, y); //調用了父類中的構造函數
}
}
var son = new Son(1, 2);
var son1 = new Son(11, 22);
son.sum();
son1.sum();
輸出結果:
super關鍵字調用父類中的普通函數
<script>
// super 關鍵字調用父類普通函數
class Father {
say() {
return '我是爸爸';
}
}
class Son extends Father {
say() {
// console.log('我是兒子');
console.log(super.say() + '的兒子');
// super.say() 就是調用父類中的普通函數 say()
}
}
var son = new Son();
son.say();
</script>
繼承中的屬性或者方法查找原則:就近原則
1)繼承中,如果實例化子類輸出一個方法,先看子類有沒有這個方法,如果有就先執行子類的
2)繼承中,如果子類裏面沒有,就去查找父類中有沒有這個方法,如果有就執行父類中的這個方法