1. 面向程序與面向物件
1.1 面向程序
面向程序就是分析出解決問題所需要的步驟,然后用函式把這些步驟一步一步實作,使用的時候再一個一個依次呼叫就可以了,
1.2 面向物件
面向物件是把事務分解成為一個個物件,然后由物件之間分工與合作,
1.3 面向程序與面向物件對比
| 面向程序 | 面向物件 | |
|---|---|---|
| 優點 | 性能比面向物件高,適合跟硬體聯系很緊密的東西,例如單片機就采用的面向程序編程 | 易維護、易復用、易擴展,由于面向物件有封裝、繼承、多型性的特性,可以設計出低耦合的系統,使系統 更加靈活、更加易于維護 |
| 缺點 | 不易維護、不易復用、不易擴展 | 性能比面向程序低 |
2. 物件與類
2.1 物件
物件是由屬性和方法組成的:是一個無序鍵值對的集合,指的是一個具體的事物
- 屬性:事物的特征,在物件中用屬性來表示(常用名詞)
- 方法:事物的行為,在物件中用方法來表示(常用動詞)
創建物件:
//字面量創建物件
var usr1 = {
name: 'Jack',
age: 18
}
console.log(usr1);
//建構式創建物件
function Star(name, age) {
this.name = name;
this.age = age;
}
var usr2 = new Star('Tom', 20) //實體化物件
console.log(usr2);
運行結果:

2.2 類
在 ES6 中新增加了類的概念,可以使用class關鍵字宣告一個類,之后以這個類來實體化物件,
類抽象了物件的公共部分,它泛指某一大類,
物件特指某一個,通過類實體化一個具體的物件,
2.2.1 創建類
// 1. 創建類 class
class Star {
// 類的共有屬性放到 constructor 里面
constructor(name, age) {
this.name = name;
this.age = age;
}
}
// 2. 利用類創建物件 new
var usr = new Star('Jack', 18);
console.log(usr);
運行結果:

通過結果我們可以看出:運行結果和使用建構式方式一樣
2.2.2 類創建添加屬性和方法
// 1. 創建類 class 創建一個類
class Star {
// 類的共有屬性放到 constructor ,里面constructor是構造器或者建構式
constructor(uname, age) {
this.uname = uname;
this.age = age;
} // 注意,方法與方法之間不需要添加逗號
do(sports) {
console.log(this.uname + '喜歡' + sports);
}
}
// 2. 利用類創建物件 new
var usr = new Star('Jack', 18);
console.log(usr);
usr.do('打籃球');
運行結果:

注意:
- 通過
class關鍵字創建類,類名習慣性定義首字母大寫 - 類里有個
constructor函式,可以接受傳遞過來的引數,同時回傳實體物件 constructor函式,只要new生成實體時,就會自動呼叫這個函式,如果不寫這個函式,類也會自動生成這個函式- 多個函式方法之間不需要添加逗號分隔
- 生成實體
new不能省略 - 創建類,類名后面不要加小括號,生成實體,類名后面加小括號,建構式不需要加
function
2.2.3 類的繼承
class Father {
constructor(surname) {
this.surname = surname;
}
say() {
console.log('你的名字是' + this.surname);
}
}
class Son extends Father {} // 這樣子類就繼承了父類的屬性和方法
var damao = new Son('Jack');
damao.say();
運行結果:

子類使用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); //使用super呼叫了父類中的建構式
}
}
var son = new Son(1, 2);
son.sum(); // 結果為3
注意:
-
繼承中,如果實體化子類輸出一個方法,先看子類有沒有這個方法,如果有就先執行子類的
-
繼承中,如果子類里面沒有,就去查找父類有沒有這個方法,如果有,就執行父類的這個方法
-
如果子類想要繼承父類的方法,同時在自己內部擴展自己的方法,利用
super呼叫父類的建構式,super必須在子類this之前呼叫
// 父類有加法方法
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 呼叫父類的建構式 super 必須在子類this之前呼叫,放到this之后會報錯
super(x, y);
this.x = x;
this.y = y;
}
subtract() {
console.log(this.x - this.y);
}
}
var son = new Son(5, 3);
son.subtract(); // 2
son.sum(); // 8
運行結果:

- 在 ES6 中類沒有變數提升,所以必須先定義類,才能通過類實體化物件
- 時刻注意
this的指向問題,類里面的共有的屬性和方法一定要加this使用
(1)constructor中的this指向的是new出來的實體物件
(2)自定義的方法,一般也指向的new出來的實體物件
(3)系結事件之后this指向的就是觸發事件的事件源
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198399.html
標籤:其他
上一篇:庫克談iPhone 12供應緊張問題;2020中國互聯網百強名單:阿里、騰訊、美團分列前三;Dgraph新版發布|極客頭條
下一篇:CCAT考試整理JAVA試題
